从Python documentation为random.shuffle,它接受一个列表,并会随机的顺序,如果它的元素:Python的random.shuffle限制
注意,即使相当小LEN(X)的 总数x的排列大于大多数随机数 发生器的周期;这意味着长序列的绝大部分排列可能永远不会生成 。
这是真的对任何语言,因为限制似乎取决于随机数发生器?是否可以编写一个函数来生成任意长的列表的任何可能的排列?
从Python documentation为random.shuffle,它接受一个列表,并会随机的顺序,如果它的元素:Python的random.shuffle限制
注意,即使相当小LEN(X)的 总数x的排列大于大多数随机数 发生器的周期;这意味着长序列的绝大部分排列可能永远不会生成 。
这是真的对任何语言,因为限制似乎取决于随机数发生器?是否可以编写一个函数来生成任意长的列表的任何可能的排列?
请参阅http://mail.python.org/pipermail/python-ideas/2009-March/003670.html。它开始出现问题的确切长度取决于PRNG,但基本问题始终适用。
@TryPyPy链接到的上一个问题也集中在Python上,但接受的答案很好地解释了为什么它总是会发生。套用,你能想象一个天真的洗牌算法,这种方式工作:
p
输入的所有可能的排列x
,从您的PRNGp[x]
如果p
比所有可能x
s表示该PRNG可以产生的名单更长,一些置换的不可达。
由于花式洗牌算法的核心是这样做,而不必在丢弃其中的一个之前生成所有可能的排列,唯一的方法是获得真正的随机性来源。
是的,这是可能的。您可以编写一个置换生成器,它使用random.SystemRandom
作为您的所有决定。
这样做的缺点是,当您的操作系统收集更多的熵供您使用时,您的程序可能不得不停止任意长的时间。
我假设你的意思是“可行”而不是“可能”。 –
我的意思是可行的,但现在我很好奇,如果它不可行,但是可能,我们在说什么疯狂? – Colin
请参阅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