这是一个实验,它证实,正如预期的那样,大约有 1 个!时代random.shuffle() 修复了元素。对于从 1 到 9 范围内的每个数字 n,我将获得恒等排列的理论概率 1/n! 与通过运行random.shuffle 100 万次获得的观察比例进行比较:
import random, math
def trialShuffles(n,k):
#shuffles [1,2,...,n] k times
#returns number of times original order results
fixedPoints = 0
nums = list(range(1,n+1))
for i in range(k):
copy = nums[:]
random.shuffle(copy)
if copy == nums: fixedPoints += 1
return fixedPoints
test = [(n,1.0/math.factorial(n),trialShuffles(n,1000000)/1000000.0) for n in range(1,10)]
print("n theoretical observed")
print("------------------------")
for (n,x,y) in test:
print("%i %f %f"%(n,x,y))
一次运行的结果:
n theoretical observed
------------------------
1 1.000000 1.000000
2 0.500000 0.499393
3 0.166667 0.166490
4 0.041667 0.041898
5 0.008333 0.008347
6 0.001389 0.001448
7 0.000198 0.000165
8 0.000025 0.000022
9 0.000003 0.000002
显然包含n=1 是没有意义的,但它会使输出看起来更好。如果我升级到n = 10,很可能我不会看到任何使元素保持不变的洗牌,除非我增加试验次数。