首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python的random.shuffle能保证元素的顺序不同吗?

python的random.shuffle能保证元素的顺序不同吗?
EN

Stack Overflow用户
提问于 2016-01-19 06:11:51
回答 2查看 421关注 0票数 2

在python中,random.shuffle就地打乱列表的元素。

我想知道是否可以保证元素在混洗后会有不同的顺序,或者它是否真的是随机的,在这种情况下,我希望元素的顺序与混洗之前相同,大约平均1次N!混洗。

EN

回答 2

Stack Overflow用户

发布于 2016-01-19 07:27:58

这是一个实验,它证实了,正如预期的那样,n中大约有1!random.shuffle()修复元素的次数。对于1到9范围内的每个数字n,我将获得单位排列的理论概率1/n!与通过运行random.shuffle 100万次获得的观察比例进行比较:

代码语言:javascript
复制
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))

一次运行的结果:

代码语言:javascript
复制
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,我很可能不会看到任何让元素固定的混洗,除非我增加了试验的数量。

票数 2
EN

Stack Overflow用户

发布于 2016-01-19 06:16:15

列表可以在之后按相同的顺序排列。

请注意,如果您混洗一个大列表,由于伪随机数生成器中的状态数量有限,并不是所有的排列都是可能的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34865006

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档