Создайте перестановку из 100 чисел, а затем выберите последовательно.
Использовать Переключение Knuth (так называемый Shuffle Fisher-Yates) Алгоритм .
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.
Но если мы будем запускать алгоритм для полного массива, то мы уверены (почти), что каждая запись обменивается.
В противном случае мы сталкиваемся с вопросом: какой 8 номеров на выбор?