python - Fisher Yates Shuffle 错误实现中的顺序偏差

标签 python algorithm combinatorics

我将洗牌算法实现为:

import random
a = range(1, n+1) #a containing element from 1 to n
for i in range(n):
    j = random.randint(0, n-1)
    a[i], a[j] = a[j], a[i]

因为这个算法是有偏见的。我只是想知道对于任何 n(n ≤ 17),是否有可能在所有可能的 n! 排列。如果是,那么该排列是什么?

例如n=3:

a = [1,2,3]

有 3^3 = 27 种可能的洗牌

没有。不同排列的出现:

1 2 3 = 4

3 1 2 = 4

3 2 1 = 4

1 3 2 = 5

2 1 3 = 5

2 3 1 = 5

附言我数学不太好。

最佳答案

这无论如何都不是证明,但您可以通过运行有偏差的算法一百万次来快速得出放置概率的分布。它看起来像来自维基百科的这张图片:

permute with all order bias

无偏分布在每个领域都有 14.3%。

为了获得最有可能的分布,我认为为每个索引选择最高百分比是安全的。这意味着很可能整个数组向下移动一个,第一个元素将成为最后一个。

编辑:我进行了一些模拟,这个结果很可能是错误的。在我想出更好的办法之前,我会留下这个答案。

关于python - Fisher Yates Shuffle 错误实现中的顺序偏差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52272402/

相关文章:

python - 来自 N 个非连续重复的 M 个元素的组合

algorithm - 懒惰地生成排列

python - 如何在检测到文件更改时发送消息? Twisted 和 Web 套接字

javascript - 如何计算预计时间精度

algorithm - 老虎机支付计算

c - 解析对角双数组

algorithm - 查找三个排列列表的可能组合数

python - 为什么 str.replace (在索引上)给出 KeyError?

python - 使用 pandas/python 进行基于优先级的分类

python - Tensorflow variable_scope 中的 partitioner 参数有什么用?