考虑到一组有限的N卡, 什么是最好的方式(算法)洗牌,所以我会有最好的洗牌包卡,最小的步骤,以获得最大的随机排列?
最小步骤的最佳解决方案是什么?
答案 0 :(得分: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)
这是经典(我相信它是最好的,使用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]