Заполнить массив случайными числами без повторов

Рейтинг: 2Ответов: 3Опубликовано: 28.04.2015

Я ощущаю разращение безумия. Требуется получить уникальный массив N длины из случайных чисел.

var arr = [],
    a = ~~(Math.random() * 42),
    i = 0;
while(b !== 42) {
    for(i=0; i<42; i+=1) {
        if(arr[i] !== a) {
            arr.push(a);
            a = ~~(Math.random() * 42);
            b+=1;
        }else{
            a = ~~(Math.random() * 42);
        }
    }
}

В итоге массив arr заполняется местами одинаковыми числами. Прошу помощи сообщества, в т.ч. показать Ваши лучшие реализации, кои Вы таковыми можете считать, при желании.

Ответы

▲ 8Принят

Math.random возвращает независимые случайные числа, соответственно, для получения случайной последовательности уникальных (то есть со всех сторон зависимых) чисел использовать ваш способ будет крайне нерационально.

Чтобы получить нужный вам список, следует заполнить массив последовательными числами в нужном вам диапазоне, а потом перемешать (отсортировать в случайном порядке).

Вот кнутовская реализация перемешивания:

function shuffle(array) {
  var currentIndex = array.length, temporaryValue, randomIndex ;

  // While there remain elements to shuffle...
  while (0 !== currentIndex) {

    // Pick a remaining element...
    randomIndex = Math.floor(Math.random() * currentIndex);
    currentIndex -= 1;

    // And swap it with the current element.
    temporaryValue = array[currentIndex];
    array[currentIndex] = array[randomIndex];
    array[randomIndex] = temporaryValue;
  }

  return array;
}

Ну а дальше:

var arr = [];
for (var i = 0; i < 42; i++)
  arr.push(i);
shuffle(arr);
console.log(arr);

См. How to randomize (shuffle) a JavaScript array?

▲ 3

Вы заполняете массив из N элементов N разными числами в диапазоне от 0 до N?

Но результат такого заполнения называется перестановкой, таким образом вам надо сгенерировать случайную перестановку. Вот третья ссылка по этому запросу в гугле:

Метод генерации случайной перестановки, алгоритм Фишера-Йетса

▲ 2
var arr = []                         //записываем в этот массив рандомные числа
var max;                              // максимальная длина массива 
var rundomnumber;                     //случайное число

while (arr.length <= max) {

    rundomnumber = Math.floor(Math.random() * max); //создадим случайное число

    if (arr.indexOf(rundomnumber) == -1) {         // проверим есть оно  у нас или нет 

        arr.push(rundomnumber);         // записываем в массив т.к нету

    }
 }