Python的random.shuffle限制

时间:2012-05-19 02:44:50

标签: python algorithm random

来自Python documentation的random.shuffle,它接受一个列表并将其元素随机化:

  

注意,即使是相当小的len(x),总数也是   x的排列大于大多数随机数的周期   发电机;这意味着长序列的大多数排列都可以   永远不会被生成。

这是否适用于任何语言,因为限制似乎取决于随机数生成器?是否可以编写一个可以生成任意长列表的任何可能排列的函数?

2 个答案:

答案 0 :(得分:3)

http://mail.python.org/pipermail/python-ideas/2009-March/003670.html。它开始出现问题的确切长度取决于PRNG,但基本问题始终适用。

@TryPyPy链接到的上一个问题也集中在Python上,但是接受的答案很好地解释了为什么它总会发生。换句话说,你可以想象一个以这种方式工作的天真洗牌算法:

  1. 生成所有可能的输入排列
  2. 的列表p
  3. 从您的PRNG
  4. 获取一个随机数x
  5. 随机列表为p[x]
  6. 如果p长于PRNG可以生成的所有可能x的列表,则某些排列无法访问。

    由于花哨的shuffle算法的核心是这样做的方式,而不必在丢弃除了其中之一之外的每一个之前生成所有可能的排列,唯一的方法是获得真正随机性的来源。

答案 1 :(得分:2)

是的,有可能。您可以编写一个使用random.SystemRandom进行所有决策的排列生成器。

这样做的缺点是,当您的操作系统收集更多熵供您使用时,您的程序可能不得不停止任意长时间。