python的random.shuffle是否保证元素的顺序不同?

时间:2016-01-18 22:11:51

标签: python random shuffle

在python中,random.shuffle将列表的元素混合在一起。

我想知道是否保证在shuffle之后元素将处于不同的顺序或者它是否真的是随机的,在这种情况下我希望元素的顺序与shuffle之前的顺序相同超出N!洗牌时间。

2 个答案:

答案 0 :(得分:1)

之后列表可能会以相同的顺序。

请注意,如果您对大型列表进行随机播放,则由于伪随机数生成器中的状态数量有限,因此不能所有排列。

答案 1 :(得分:0)

这是一个实验,它确认了正如预期的那样,大约有1个是n!时间random.shuffle()修复了元素。对于每个数字n,在1到9的范围内,我将获得身份置换的理论概率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,除非我增加试验次数,否则我不会看到任何使元素固定的洗牌。