2012-05-19 30 views
5

Python documentation为random.shuffle,它接受一个列表,并会随机的顺序,如果它的元素:Python的random.shuffle限制

注意,即使相当小LEN(X)的 总数x的排列大于大多数随机数 发生器的周期;这意味着长序列的绝大部分排列可能永远不会生成 。

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

+0

我假设你的意思是“可行”而不是“可能”。 –

+0

我的意思是可行的,但现在我很好奇,如果它不可行,但是可能,我们在说什么疯狂? – Colin

+4

请参阅http://stackoverflow.com/questions/3062741/maximal-length-of-list-to-shuffle-with-python-random-shuffle和http://mail.python.org/pipermail/python-dev/ 2006年6月/ 065815.html(按照线程,这是一个真实的,如果不是太严重,问题)。 – TryPyPy

回答

3

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

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

  1. 生成一个列表,p输入的所有可能的排列
  2. 得到一个随机数,x,从您的PRNG
  3. 的的,洗牌名单p[x]

如果p比所有可能x s表示该PRNG可以产生的名单更长,一些置换的不可达。

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

2

是的,这是可能的。您可以编写一个置换生成器,它使用random.SystemRandom作为您的所有决定。

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