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