错误实施Fisher Yates Shuffle的顺序偏向

时间:2018-09-11 09:04:33

标签: 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

P.S。我数学不太好。

1 个答案:

答案 0 :(得分:0)

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

permute with all order bias

无偏分布在每个字段中占14.3%。

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

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