我对以下函数进行了多次模拟,考虑到所有排列大致相等,这似乎是公平的洗牌,但我不明白它为什么有效。它只是在当前洗牌的牌组中随机插入,不是吗?
def shuffle_deck(deck):
shuffled_deck = []
for card in deck:
r = random.randint(0, len(shuffled_deck))
shuffled_deck.insert(r, card)
return shuffled_deck
我预计这会是不均匀的概率排列。
生成“显然”有效的随机排列的一种方法是从一副完整的牌开始,重复地从该牌中随机选择一张牌并将其放在新牌上,直到旧牌消失。
如果你这样做,并记住你使用的所有随机数,那么你可以将它们输入到你的洗牌算法中,将新牌组变回旧牌——你的洗牌算法完全撤销了原来的洗牌。
因此你的算法是有效的,因为它产生随机排列的逆,这也是随机排列。