这种实施就地洗牌是统一的吗?"

时间:2017-06-09 05:34:05

标签: javascript algorithm shuffle uniform

对不起,如果这个问题有点奇怪;不过我还不确定在哪里可以问它!

我正在解决一些问题,而且我找到了Fisher-Yates 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 个答案:

答案 0 :(得分:0)

请注意,循环的每次迭代都会为变量提供n^2个索引组合,而n次迭代会给出n^(2n)个变体,但此值不会为n!均匀地划分n>2个排列因此,某些排列的概率会高于其他排列。

清楚的例子:
对于{1,2,3}的6个排列有729个结果,729/6 = 121. 5 ,因此排列的可能性变化。