来自 random.shuffle 的Python 文档,它采用一个列表并随机化其元素的顺序:
请注意,即使是相当小的 len(x),x 的排列总数也大于大多数随机数生成器的周期;这意味着永远不会生成长序列的大多数排列。
这是否适用于任何语言,因为限制似乎取决于随机数生成器?是否可以编写一个函数来生成任意长列表的任何可能排列?
请参阅http://mail.python.org/pipermail/python-ideas/2009-March/003670.html。它开始成为问题的确切长度取决于 PRNG,但基本问题将始终适用。
@TryPyPy 链接到的上一个问题也关注 Python,但接受的答案很好地解释了为什么它总是会发生。套用一下,你可以想象一个幼稚的洗牌算法以这种方式工作:
p
输入的所有可能排列的列表x
从您的 PRNG 中获取一个随机数p[x]
如果p
长于x
PRNG 可以产生的所有可能的 s 的列表,则某些排列是不可达的。
由于花哨的 shuffle 算法的核心是一种这样做的方法,而无需在丢弃除其中一个之外的所有排列之前生成所有可能的排列,因此解决此问题的唯一方法是拥有真正随机性的来源。
对的,这是可能的。您可以编写一个排列生成器,random.SystemRandom
用于您的所有决策。
这样做的缺点是您的程序可能不得不暂停任意长的时间,而您的操作系统会收集更多的熵供您使用。