这个简单的洗牌算法是否返回一副随机洗牌的扑克牌?



你有一个包含52张牌的列表,其中这些牌在列表中的位置不会移动。你有第二个牌位列表。首先,位置列表与第一个列表相同。

  1. 遍历第一个列表。

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

存在偏见吗?为什么?

更新:从来没有人相信纯粹的数学或逻辑,我决定自己实现这个。以下是第5张牌(按位置排列)是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,有更多的交换机会有关——这正是正确的算法所防止的,它只让牌交换一次。

这是搞砸Fisher-Yates洗牌算法的一种常见方法。看看你从这个破碎的随机洗牌中得到了什么分布?关于此实现的属性的生动讨论。


这和Fisher-Yates有什么不同?

对于Fisher-Yates,在第k张牌,你必须在k52之间选择一个随机数。每次在152之间选择一个随机数。


你所描述的方法与讨论的方法类似,你从这个破碎的随机洗牌中得到什么分布?,但可能不完全相同。你的实现类似于"从顶到随机"洗牌的研究(参见Diaconis, Fill和Pitman对从顶到随机洗牌的分析),最终会给出一个完全洗牌的牌组,尽管不是"一次"。从Top到Random洗牌的描述如下:

1p中选择一个随机数52,并将顶部卡与在位置p的卡。持续到最上面的牌是原来的牌位置52,之后是随机放置的牌组是随机的秩序。

这个停止条件被称为"停止时间",需要相当长的时间才能达到。费雪-叶茨洗牌要快得多。

是的,存在偏差,而且很容易计算。

你向随机数生成器请求52次1到52之间的数字。最后,总共有52^52种可能的答案。

但是只有52个!可能的洗牌,因此在上述算法中,洗牌不能均匀分布。

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

最新更新