Показать сообщение отдельно
  #9 (permalink)  
Старый 31.05.2012, 21:33
Профессор
Отправить личное сообщение для oneguy Посмотреть профиль Найти все сообщения от oneguy
 
Регистрация: 31.05.2012
Сообщений: 396

Если я правильно понял, что нужно из 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 имитирует бросание кубика Если вы хотели, чтоб картинки выпадали с одинаковой вероятностью, то в варианте с одной картинкой нужно писать Math.floor(Math.random()*6)

Последний раз редактировалось oneguy, 31.05.2012 в 21:35.
Ответить с цитированием