【问题标题】:Is this implementation of an in-place shuffle "uniform?" [duplicate]这种就地洗牌的实现是“统一的”吗? [复制]
【发布时间】:2017-06-09 05:34:04
【问题描述】:

对不起,如果这个问题非常具体;不过,我不知道还能去哪里问它!

我正在解决一些问题,并且我找到了 Fisher-Yates Shuffle,但我想知道我想到的第一个 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;
}

【问题讨论】:

    标签: javascript algorithm shuffle uniform


    【解决方案1】:

    请注意,循环的每次迭代都会给出 n^2 的索引组合以进行更改,并且 n 次迭代会给出 n^(2n) 变体,但该值不会将 n! 排列均匀地除以 n>2,因此某些排列将具有更高概率比别人高。

    清晰的例子:
    {1,2,3}的6个排列有729个结果,729 / 6 = 121。5,所以排列的概率不同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-21
      • 2014-08-07
      • 1970-01-01
      相关资源
      最近更新 更多