-2
A
回答
2
这是典型的(我认为可证明是最好的,使用需要LEN(x)的阶乘排列位的确切数目):
def shuffle(x):
"""Shuffle list x in place, and return None."""
for i in reversed(range(1, len(x))):
# pick an element in x[:i+1] with which to exchange x[i]
j = int(random() * (i+1))
x[i], x[j] = x[j], x[i]
+2
看起来不错。重要的一点是,你可能首先想到的是,将i上的随机数交换为N,而不是0到N。在0到N之间交换给出了一个奇怪的,不均匀的分布。 –
7
使用Fisher Yates algorithm。许多编程语言使用该算法的变体来混洗有限集合的元素。这是Fisher Yates算法的伪码(由Richard Durstenfeld优化的版本):
-- To shuffle an array a of n elements (indices 0..N-1):
for i from N−1 downto 1 do
j ← random integer such that 0 ≤ j ≤ i
exchange a[j] and a[i]
该算法确保均匀分布。对于N
卡,有N!可能的混洗组合。这里排列的N!
中的任何一个都可能返回。时间复杂度是O(N)
。
相关问题
- 1. 洗牌算法:晚餐部门洗牌
- 2. 洗牌阵列的最佳算法
- 3. 这个洗牌算法为什么是错的?
- 4. 什么是一个很好的洗牌比例?
- 5. 算法洗牌数据
- 6. 什么导致这个奇怪的洗牌算法行为?
- 7. 什么是“洗牌”数据库记录表的最佳方式?
- 8. 的快速算法进行排序和洗牌等值项(最好STL的)
- 9. 洗牌回收数据的算法
- 10. 蟒蛇洗牌算法的性能
- 11. 数组乘法 - 什么是最好的算法?
- 12. 什么是好的(半)异步算法?
- 13. 什么是好的重叠组算法?
- 14. 什么是好的轮询算法
- 15. 我的列表管理最好的算法是什么?
- 16. 这个简单的洗牌算法是否会返回随机洗牌的扑克牌?
- 17. 什么是卡洗牌程序如何工作的一个很好的解释?
- 18. 完美洗牌算法实现错误
- 19. 什么是两维最近邻问题的好算法?
- 20. 这种情况下最好的排序算法是什么?
- 21. 什么是最好的预留座位排序算法?
- 22. 什么是最好的“交钥匙”干扰算法?
- 23. 什么是最好的算法来解决拼图游戏
- 24. 什么是最好的深度图生成算法?
- 25. 什么是记录最好的方法?
- 26. 什么是最好的Ajax方法?
- 27. Sort ObservableCollection - 什么是最好的方法?
- 28. 什么是最好的方法有URL
- 29. NSArray无法洗牌
- 30. 如何最好地描述TreeSort和HeapSort算法是什么?
你怎么定义最好的洗牌包? – Pang
定义“最佳”。此外,这个问题主要是基于意见的,或者要求提供第三方内容的建议,这两者在Stack Overflow上都是无关紧要的。 –
最小步骤和卡片之间的距离,显然某些类型的洗牌优于其他类型。 –