Является ли эта реализация перемешивания на месте "униформой"?
Извините, если этот вопрос странно конкретный; Я не был уверен, где еще спросить это, хотя!
Я работаю над некоторыми проблемами, и я нашел Shuffle Фишера-Йейтса, но я хочу знать, является ли это первое перемешивание, о котором я думал, равномерным или нет? Я не лучший с вероятностью.. или математика... Ха.
Идея довольно проста; для стольких элементов, сколько есть в массиве, выберите два случайно и поменяйте их местами.
function inPlaceShuffle(arr) {
const floor = 0,
ceil = arr.length - 1;
let i = arr.length;
while (i > 0) {
swap(arr, getRandom(floor, ceil), getRandom(floor, ceil));
i--;
}
return arr;
}
function swap(arr, firstIndex, secondIndex) {
const temp = arr[firstIndex];
arr[firstIndex] = arr[secondIndex];
arr[secondIndex] = temp;
}
function getRandom(floor, ceil) {
floor = Math.ceil(floor);
ceil = Math.floor(ceil);
return Math.floor(Math.random() * (ceil - floor + 1)) + floor;
}
1 ответ
Обратите внимание, что каждая итерация цикла дает n^2
комбинации индексов для изменения и n итераций дают n^(2n)
варианты, но это значение не делит n!
перестановки равномерно для n>2
, поэтому некоторые перестановки будут иметь более высокую вероятность, чем другие.
Наглядный пример:
Имеется 729 результатов для 6 перестановок из {1,2,3}, 729/6 = 121. 5, поэтому вероятность перестановок варьируется.