Math.random никогда не будет генерировать то же количество, что и другие Math.random [duplicate]

На этот вопрос уже есть ответ:

У меня есть 4 генератора Math.random. Каждый выбор 1 объектов X из массива.

  var randomItem1 = projects[Math.floor(Math.random()*projects.length)];
  var randomItem2 = projects[Math.floor(Math.random()*projects.length)];
  var randomItem3 = projects[Math.floor(Math.random()*projects.length)];
  var randomItem4 = projects[Math.floor(Math.random()*projects.length)];

Как я могу написать функцию, которая мешает Math.random генерировать тот же номер, что и другой генератор Math.random.

Мое предположение: создание цикла, который проходит через var randomItem 1 till 4. Если он приходит к выводу 1 или более выходов , чтобы быть таким же, он будет восстанавливаться новый выходной вар проекты вар randomProjects функция getRandomProjects ( проекты , SampleSize ) { VAR projectsClone = проекты . slice (); var randomItems = []; while ( sampleSize -) { randomItems . push ( projectsClone . сращивание ( Math , floor ( Math . random () * projectsClone . length ), 1 ) [ 0 ] ); } return randomItems ; } projects = [ «1-й проект» , «2-й проект» , «3-й проект» , «4-й проект» , «5-й проект» , «6-й проект» ]; randomProjects = getRandomProjects ( проекты , 4 ); randomProjects . forEach ( function ( randomProject ) { console . log ( randomProject ); }); 1 или более дублированных выходов.

Любые другие предложения?

Изменить: это для веб-сайта.

javascript,javascript,

0

Ответов: 2


1

Спасибо за интересную проблему. Я всегда использовал библиотеку для такого рода вещей, поэтому было интересно понять это.

projectsClone.splice(...)

projectsCloneУдаляет случайный проект от [<project>]и возвращает его в качестве отдельного элемента в массиве ( <project>). Таким образом, в следующей итерации цикла, значение value ( _.sampleSize(projects, 4)) больше не может быть выбран.

Однако я бы предложил использовать библиотеку, если вы используете это в производственном коде. Например, losdash'sSet


1

Обновить

Удалены ненужные части, такие как for, forпетля, и добавил splice(). Эта функция будет мутировать исходный массив из-за splice(). Использование splice()в массиве последовательных упорядоченных номеров (даже после перетасовки) гарантирует набор уникальных чисел.


/**
 * genRan(quantity, length)
 *
 * Need a given amount of unique random numbers.
 *
 * Given a number for how many random numbers are to be returned (@quantity) and a 
 * number that represents the range of consecutive numbers to extract the random 
 * numbers from (@length), this function will:
 *  - generate a full array of numbers with the length of @length
 *  - use shuffle() to shuffle the array to provide an array of randomly ordered numbers 
 *  - splices the first @quantity numbers of the shuffled array
 *  - returns new array of unique random numbers
 *
 * @param {Number} quantity      length of returned array.
 * @param {Number} length        length of an array of numbers. 
 * 
 * @return {Array} An array of unique random numbers.
 */


демонстрация

Подробная информация в Demo

var qty = 4
var len = 100;

function genRan(quantity, length) {
  // Ensure that quantity is never greater than length
  if (quantity > length) {
    quantity = length;
  }
  // Create an array of consecutive numbers from 1 to N
  var array = Array.from({
    length: length
  }, (value, key = 0) => key + 1);
  // Run shuffle get the returned shuffled array
  var shuffled = shuffle(array);
  // return an array of N (quantity) random numbers 
  return shuffled.splice(0, quantity);
}

console.log(genRan(qty, len));

/* shuffle utility 
|| Uses Fisher-Yates algorithm
*/
function shuffle(array) {
  var i = 0;
  var j = 0;
  var temp = null;
  for (i = array.length - 1; i > 0; i -= 1) {
    j = Math.floor(Math.random() * (i + 1))
    temp = array[i];
    array[i] = array[j];
    array[j] = temp;
  }
  return array;
}

JavaScript, JavaScript,
Похожие вопросы
Яндекс.Метрика