2011-07-09 55 views
7

你有一张列表中的卡片在该列表中的位置不移动的52张卡片。 你有第二张卡位置列表。首先,位置列表与第一个列表相同。这个简单的洗牌算法是否会返回随机洗牌的扑克牌?

  1. 遍历第一个列表。

  2. 对于第一个列表中的每张卡片,生成一个从1到52的数字。在第二个列表中交换其位置,卡片在该位置。

是否存在偏见?为什么?

更新:永远不要相信纯粹的数学或逻辑,我决定自己实现这一点。下面是第五张(位置明智)的百分比几率是每个号码从1到52:

1. 1.9346% 
2. 1.9011% 
3. 1.8513% 
4. 1.8634% 
5. 1.8561% 
6. 1.8382% 
7. 2.5086% 
8. 2.4528% 
9. 2.4552% 
10. 2.3772% 
11. 2.3658% 
12. 2.3264% 
13. 2.3375% 
14. 2.287% 
15. 2.2627% 
16. 2.2151% 
17. 2.1846% 
18. 2.1776% 
19. 2.1441% 
20. 2.1103% 
21. 2.084% 
22. 2.0505% 
23. 2.0441% 
24. 2.0201% 
25. 1.972% 
26. 1.9568% 
27. 1.9477% 
28. 1.9429% 
29. 1.9094% 
30. 1.8714% 
31. 1.8463% 
32. 1.8253% 
33. 1.8308% 
34. 1.8005% 
35. 1.7633% 
36. 1.7634% 
37. 1.769% 
38. 1.7269% 
39. 1.705% 
40. 1.6858% 
41. 1.6657% 
42. 1.6491% 
43. 1.6403% 
44. 1.6189% 
45. 1.6204% 
46. 1.5953% 
47. 1.5872% 
48. 1.5632% 
49. 1.5402% 
50. 1.5347% 
51. 1.5191% 
52. 1.5011% 

正如你所看到的,完全是非随机的。我很喜欢数学家来证明为什么第5张牌比其他任何东西更可能是7,但我猜这与7这样的早期牌有更多机会交换有关 - 这是正确的算法可以防止,它只允许卡交换一次。

回答

12

这是一个常见的方式来弄糟Fisher-Yates shuffle algorithm。请参阅What distribution do you get from this broken random shuffle?,以便对此实现的属性进行热烈的讨论。


这是如何从费雪耶茨有什么不同?

对于费雪耶茨,在k次卡,你必须选择k52之间的随机数。您每次选择152之间的随机数字。


您描述的方法与What distribution do you get from this broken random shuffle?中讨论的方法类似,但可能并不完全相同。你的实现类似于“随机排序”的洗牌研究(见Diaconis,Fill和Pitman的Analysis of Top To Random Shuffles),它最终会给出一个完全洗牌的套牌,尽管不是“一次通过”。顶部的随机洗牌描述如下:

选择从1随机数p52,并在p位置换顶牌与 卡。继续到 顶牌是原本在 的位置52,此后是 随机摆放的牌组是随机的 命令。

此停止条件被称为“停止时间”,并且需要相当长的时间才能达到。 Fisher-Yates洗牌速度更快。

2

是的,存在一个偏差,并且它很容易计算。

您可以让随机数发生器52次查找1到52之间的数字。这最终可能会达到52^52个可能的答案。

但是只有52!可能的洗牌甲板,所以使用上述算法,洗牌不能均匀分布。

您需要确保您询问随机数发生器的ld(52!)位随机性,而不是ld(52^52)