Python随机混洗如何工作?


11

在Python中如何进行随机混洗?

我问,因为它工作非常快。当我尝试编写shuffle时,它对10 ^ 6元素的工作时间为1分钟,但是Python shuffle可以在8秒钟内完成吗?


14
为什么不只看源代码
2013年

4
最好的洗牌算法是fisher-yates洗牌,它以O(n)的时间运行,并且被证明是完美的洗牌(假设有很好的随机来源)
棘手怪胎

1
@ratchetfreak:Python使用Fisher-Yates。
马丁·彼得

1
您的随机播放算法是什么?
whatsisname 2013年

@sloth,顺便说一句,Raymond Hettinger 在2011
。– Cristian Ciupitu 2015年

Answers:


17

Python random.shuffle使用的是Fisher-Yates随机播放,运行时间为O(n),并且被证明是完美的随机播放(假设随机数生成器很好)。

它将数组从最后一个条目迭代到第一个条目,将每个条目与位于其下方的随机索引处的条目切换。

Fisher-Yates改组的基本过程类似于从帽子或甲板上随机抽取编号的门票,一个接一个地重复直到不再剩下。特定算法提供的是一种以高效且严格的方式在数值上执行此操作的方法,正确执行后可确保结果无偏见。

现代的解决方案是通过在每次迭代中将“删除”的数字与最后未删除的数字交换来将其移动到列表的末尾。与单纯的实现相比,这将算法的时间复杂度降低到O(n 2)。此更改提供了以下算法(针对基于零的数组)。

To shuffle an array a of n elements (indices 0..n-1):
  for i from n  1 downto 1 do
       j  random integer with 0  j  i
       exchange a[j] and a[i]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.