Является ли эта реализация перемешивания на месте "униформой"?

Извините, если этот вопрос странно конкретный; Я не был уверен, где еще спросить это, хотя!

Я работаю над некоторыми проблемами, и я нашел 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, поэтому вероятность перестановок варьируется.

Другие вопросы по тегам