洗牌的最佳算法是什么?

时间:2016-10-15 10:02:38

标签: algorithm language-agnostic shuffle

考虑到一组有限的N卡, 什么是最好的方式(算法)洗牌,所以我会有最好的洗牌包卡,最小的步骤,以获得最大的随机排列?

最小步骤的最佳解决方案是什么?

2 个答案:

答案 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]
相关问题