Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Math.random несколько объектов (https://javascript.ru/forum/misc/28701-math-random-neskolko-obektov.html)

Beriagts 30.05.2012 13:10

Math.random несколько объектов
 
Состоит задача выводить рандом 8 картинок с 20.
Как сделать для одной код ниже, а вот как сделать для 8 ?
var a=Math.round(Math.random()*5) 
image = new Array();
image[0]="1.jpg"
image[1]="2.jpg"
image[2]="3.jpg"
image[3]="4.jpg"
image[4]="5.jpg"
image[5]="6.jpg"
document.write ("<img src="+image[a]+">");

bot87 30.05.2012 13:52

<script>



image = new Array();
image[0]="1.jpg"
image[1]="2.jpg"
image[2]="3.jpg"
image[3]="4.jpg"
image[4]="5.jpg"
image[5]="6.jpg"
image[6]="0.jpg"
image[7]="7.jpg"
image[8]="8.jpg"
image[9]="9.jpg"
image[10]="10.jpg"
image[11]="11.jpg"

for(i=0;i<6;i++){
	var a=Math.round(Math.random()*11)
document.write ("<img src="+image[a]+" width=100 height=100>");
}
</script>

Посмотри,вроде работает.С 11 картинок выводится 6:)

Beriagts 30.05.2012 16:05

Да все работает но теперь еще одна проблема, как сделать чтобы они не повторялись .

bot87 30.05.2012 16:09

ну тЫ ведь просил рандом .....:).Сейчас подумаю

bot87 30.05.2012 16:32

<script>
image = new Array();
image[0]="1.jpg"
image[1]="2.jpg"
image[2]="3.jpg"
image[3]="4.jpg"
image[4]="5.jpg"
image[5]="6.jpg"
image[6]="0.jpg"
image[7]="7.jpg"
image[8]="8.jpg"
image[9]="9.jpg"
image[10]="10.jpg"
image[11]="11.jpg"
image[12]="12.jpg"
image[13]="13.jpg"
image[14]="14.jpg"
image[15]="15.jpg"
image[16]="16.jpg"
image[17]="17.jpg"
image[18]="18.jpg"
image[19]="19.jpg"
image[20]="20.jpg"
var a=Math.round(Math.random()*11)
for(i=0;i<8;i++){
	

    //var a=Math.round(Math.random()*11)
document.write ("<img src="+image[a+i]+" width=100 height=100 >");
}

</script>

Beriagts 30.05.2012 18:20

Если уменьшить количество картинок или увеличить то для некоторых картинок идет
<img src="undefined" data-text="undefined">

И что такое *11 от чего зависит ?

bot87 30.05.2012 19:20

var a=Math.round(Math.random()*11) генерирует число от 0 до 11 рандомно каждЫй раз при обновлении страници.
Теперь у нас будет создаваться 8 картинок (for(i=0;i<8;i++){}) а и адрес будет a+i.
Если а=11 то загрузятся картинки 11,12,13,14,15,16,17,18,19
Если а=0 то от 0-7.
Возможно нужно написать не 11 ,а 12

Deff 30.05.2012 19:49

Цитата:

Сообщение от Beriagts
Как сделать для одной код ниже, а вот как сделать для 8 ?

А какой алгоритм - первая картинка случайно - за ней следуют следущие?

или все случайно - и не пересекаются до полной выборки(тогда их
N*M(минимум_Не_пересекающихс я_Выборок) или...?

oneguy 31.05.2012 21:33

Если я правильно понял, что нужно из 20 картинок случайно выбрать 8 и показать их в случайном порядке, то вот:
/* Эта функция выбирает случайное размещение m чисел из набора 0, 1, ..., n-1 и возвращает его в виде массива.
Например: selectRandom(20, 8) -> [1,12,9,0,19,3,5,10] */
function selectRandom(n, m) {
  var a=[], result=[];
  for (var i=0; i<n; i++)
    a.push(undefined);
  for (i=0; i<m; i++) {
    var c=Math.floor(Math.random()*(n-i));
    a.some(function(unused, j){
      if (!с--) {
        result.push(j);
        delete a[j];
        return true;
      }
    });
  }
  return result;
}

Хочу ещё заметить, що выражение Math.round(Math.random()*5) действительно выбирает случайное целое число от 0 до 5, но исходы не равновероятны: числа 0 и 5 будут выпадать в 2 раза реже, чем остальные. Потому что, например, 0 выпадет когда значение Math.random()*5 будет в промежутке [0, 0.5), числу 1 соответствует промежуток [0.5, 1.5) - последний в 2 раза длиннее. Эту ошибку я уже встречал в одном учебнике по Javascript, где говорилось, что выражение Math.round(Math.random()*5)+1 имитирует бросание кубика :lol: Если вы хотели, чтоб картинки выпадали с одинаковой вероятностью, то в варианте с одной картинкой нужно писать Math.floor(Math.random()*6)

Dim@ 31.05.2012 22:39

Могу предложить свой вариант (реализован на своей программе о рандомном бросании кубика) правда не знаю на сколько он рандомен:)
var i;
var sh = 0;
var prov = new Array(8);
function izm(){
 i = Math.random();
 i *= 100;
 i = Math.round(i);
 if((i > 20)||(i == 0)){izm();return}
 prov[sh] = i;
 for(k = 0; k < prov.length; k++){
   if(sh == k) break;
   if(prov[sh] == prov[k]){izm();return}
 }
 alert("<img src=\""+i+".jpg\" width=100 height=100>");//здесь алерт надо на document.write сменить
 sh++
 if(sh < 8) izm();
}
izm()


Часовой пояс GMT +3, время: 05:01.