Создайте перестановку из 100 чисел и затем выберите последовательно.
Использование Алгоритм Кнута Шаффла (он же тасование Фишера-Йейтса) .
JavaScript:
function fisherYates ( myArray,stop_count ) {
var i = myArray.length;
if ( i == 0 ) return false;
int c = 0;
while ( --i ) {
var j = Math.floor( Math.random() * ( i + 1 ) );
var tempi = myArray[i];
var tempj = myArray[j];
myArray[i] = tempj;
myArray[j] = tempi;
// Edited thanks to Frerich Raabe
c++;
if(c == stop_count)return;
}
}
КОД, КОПИРОВАННЫЙ ИЗ ССЫЛКИ.
EDIT
Улучшенный код:
function fisherYates(myArray,nb_picks)
{
for (i = myArray.length-1; i > 1 ; i--)
{
var r = Math.floor(Math.random()*i);
var t = myArray[i];
myArray[i] = myArray[r];
myArray[r] = t;
}
return myArray.slice(0,nb_picks);
}
Потенциальная проблема:
Предположим, у нас есть массив из 100 чисел {например, [1,2,3 ... 100]} и мы прекращаем обмен после 8 перестановок;
тогда массив в большинстве случаев будет выглядеть как {1,2,3,76,5,6,7,8, ... числа здесь будут перемешаны ... 10}.
Потому что каждое число будет поменяно местами с вероятностью 1/100, так
Проб. поменять местами первые 8 чисел - 8/100, тогда как проб. обменять другой 92 - 92/100.
Но если мы запустим алгоритм для полного массива, то мы уверены (почти), что каждая запись поменялась местами.
В противном случае мы сталкиваемся с вопросом: какие 8 цифр выбрать?