【问题标题】:Does python's random.shuffle guarantee the elements will be in a different order?python 的 random.shuffle 是否保证元素的顺序不同?
【发布时间】:2016-01-18 22:11:51
【问题描述】:

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

我想知道是否可以保证在洗牌后元素的顺序不同,或者它是否真的是随机的,在这种情况下,我希望元素的顺序与洗牌前的顺序相同,平均约为 1超时N! 随机播放。

【问题讨论】:

  • random.shuffle是基于random.random中的随机数生成器均匀生成的。所以是的,列表有可能保持相同的顺序。
  • 如果它保证元素的顺序不同,它就不再是随机的了。
  • 这很容易测试,您可以尝试使用两个元素list。最终,它将连续两次以相同的顺序结束。
  • @ShadowRanger 你是对的,我应该测试一下。

标签: python random shuffle


【解决方案1】:

这是一个实验,它证实,正如预期的那样,大约有 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,很可能我不会看到任何使元素保持不变的洗牌,除非我增加试验次数。

【讨论】:

    【解决方案2】:

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

    请注意,如果您对大型列表进行洗牌,由于伪随机数生成器中的状态数量有限,并非所有排列都是可能的。

    【讨论】:

    • 你有第二位的参考吗?特别是,到底有多“大”?
    • @tobias_k:这就是 PRNG 的工作原理(鸽洞论点)。对于 Python 中经常使用的 MT19937 生成器,如果你的列表有 2081 个或更多元素,则不是所有的排列都可以生成。实际上,根据shuffle() 的实现,对于较小的列表也可能如此。 en.wikipedia.org/wiki/Pseudorandom_number_generator
    • The docs mention this (没有说明有多大,因为他们不想限制他们对实现的选择):“请注意,即使是相当小的len(x),排列的总数x 大于大多数随机数生成器的周期;这意味着永远无法生成长序列的大多数排列。"
    猜你喜欢
    • 2010-11-23
    • 2015-04-21
    • 1970-01-01
    • 2016-07-14
    • 1970-01-01
    • 2020-10-23
    • 2010-11-29
    • 1970-01-01
    • 2011-11-05
    相关资源
    最近更新 更多