我知道这篇文章将近4岁了,但是我是一名业余密码分析家,并且一直在研究扑克牌密码。因此,我已经一遍又一遍地回到这篇文章,来解释甲板改组是作为随机地锁定甲板的熵的一种来源。最后,我决定通过手工洗甲板来验证答案,并在每次洗牌后估计甲板熵。
TL; DR,以最大化甲板熵:
- 仅用于浅滩混洗,您需要11-12次混洗。
- 要先剪切甲板然后再进行浅滩混洗,您只需要进行6到7次剪切和混洗。
首先,水草提到的用于计算香农熵的一切都是正确的。可以这样将其归结为:
- 通过数字方式为平台中的52张卡片分配唯一值。
- 洗净甲板。
- 对于n = 0到n = 51,记录(n-(n + 1)mod 52)mod 52的每个值
- 计算出现次数0、1、2,...,49、50、51
- 将这些记录除以52来归一化这些记录
- 对于i = 1到i = 52,计算-p_i * log(p_i)/ log(2)
- 求和
stachyra做出一个微妙的假设的地方是,在计算机程序中实现人为改组会带来一些负担。使用纸质扑克牌时,纸上的油脂会从您的手中转移到扑克牌上。在较长的时间内,由于油的堆积,卡将开始粘在一起,最终会洗牌。牌组使用得越多,两张或更多相邻纸牌粘在一起的可能性就越大,发生的频率就越高。
此外,假设两个球杆和红色的杰克粘在一起。他们可能会在您洗牌的整个过程中粘在一起,永不分离。这可以在计算机程序中模仿,但是stachyra的R例程不是这种情况。
而且,水苏属具有操纵变量“ mixprob”。如果不完全了解此变量,则有点黑匣子。您可能会错误地设置它,从而影响结果。因此,我想确保他的直觉是正确的。因此,我手动进行了验证。
在两种不同的情况下,我手动洗了20次甲板(总共洗了40次)。在第一种情况下,我只是略作混编,将左右两边的割缝保持接近。在第二种情况下,我故意将甲板从甲板中间(1 / 3、2 / 5、1 / 4等)切开,然后再将浅滩混洗进行均匀切割。在第二种情况下,我的直觉是通过在改组之前切开甲板,并远离中间,我可以比普通的浅滩混编更快地将扩散引入甲板。
这是结果。首先,直接浅滩混洗:
这是削减甲板与浅滩改组:
似乎熵是水苏树声称的时间的1/2左右。此外,我的直觉是正确的,即在浅滩混洗确实将更多的扩散引入甲板之前,有意将甲板从中间首先切开。但是,经过大约5次改组后,它实际上不再重要了。您可以看到,经过大约6到7次洗牌后,熵达到了最大,而10到12则是我的水苏打法。7次洗牌就足够了吗,还是我被蒙蔽了双眼?
您可以在Google表格中查看我的数据。我可能错误地记录了一张或两张纸牌,因此不能保证数据的100%准确性。
同样重要的是,您的发现也必须得到独立验证。哈佛大学数学系的布拉德·曼(Brad Mann)研究了在纸牌中的任何一张纸牌的可预测性完全不可预测(香农熵最大化)之前,需要洗牌多少次。他的结果可以在这份33页的PDF中找到。
他的发现有趣的是,他实际上是在独立验证Persi Diaconis在1990年的《纽约时报》上的一篇文章,该文章声称7个混洗足以通过浅滩混洗彻底混合一副扑克牌。
布拉德·曼(Brad Mann)在混洗中研究了几种不同的数学模型,包括马尔可夫链,得出以下结论:
对于n = 52,这大约为11.7,这意味着,按照这种观点,我们期望平均需要11或12次随机播放才能随机分配一张真正的纸牌。请注意,这实际上大于7。
布拉德·曼(Brad Mann)只是独立地证实了水苏木的结果,而不是我的。因此,我仔细查看了我的数据,发现为什么7次混洗不足。首先,卡组中任何卡的理论最大香农熵(以位为单位)为log(52)/ log(2)〜= 5.7位。但是我的数据从未真正突破5位以上。奇怪的是,我在Python中创建了一个由52个元素组成的数组,将其改组为:
>>> import random
>>> r = random.SystemRandom()
>>> d = [x for x in xrange(1,52)]
>>> r.shuffle(d)
>>> print d
[20, 51, 42, 44, 16, 5, 18, 27, 8, 24, 23, 13, 6, 22, 19, 45, 40, 30, 10, 15, 25, 37, 52, 34, 12, 46, 48, 3, 26, 4, 1, 38, 32, 14, 43, 7, 31, 50, 47, 41, 29, 36, 39, 49, 28, 21, 2, 33, 35, 9, 17, 11]
计算其每卡熵产生约4.8位。进行十次左右的测试显示相似的结果在5.2位和4.6位之间变化,平均值为4.8至4.9。因此,仅查看数据的原始熵值是不够的,否则我可以称其为5次混洗。
当我仔细查看数据时,我注意到“零存储桶”的数量。这些是存储区,在该存储区中没有该编号的卡面之间的增量数据。例如,当减去两张相邻纸牌的值时,在计算所有52个增量之后就没有“ 15”结果。
我看到它最终在11-12个混洗附近稳定在17-18个“零桶”附近。果然,我经过Python洗牌后的牌组平均有17-18个“零桶”,最高分为21个,最低为14个。为什么17-18是已结算的结果,我还不能解释...。但是,似乎我既需要约4.8位的熵,又需要17个“零桶”。
用我的股票浅滩混洗,这是11-12次混洗。用我的即洗即用,就是6-7。因此,在游戏方面,我建议您随意剪切和拖曳。这不仅可以确保顶牌和底牌在每次混洗中都混入卡组中,而且比11-12个混洗还快。我不了解您,但是当我与家人和朋友玩纸牌游戏时,他们还没有足够的耐心让我进行12次浅滩混音。