几天前在看到一道有趣的谜题 : The condemned prisoners and the boxes ,作者给出了解法和并使用 R 来展示分析过程,使用 data visualization 来分析理解问题的方法很赞。
R 我没有用过,作为一个 python 爱好者,相信类似的统计分析和可视化 python 一定是有类似的工具的,正好几天前工作中需要分析并可视化数据,就开始寻找,最终在 stackoverflow 上发现很多人推荐 matplotlib 这个工具,配合 ipython 使用,体验很不错,所以遇到这道谜题的时候,用 python+matplotlib 也实验了一把,谜题背后的原理和数据证明参考最后给出的链接,这里主要通过例子来介绍如何使用 python 来做可视化。
进入正题:
有 100 个罪犯,编号 0-99 , 又有 100 个盒子,每个盒子里放一张带编号的纸条,也是 0-99 ,对应 100 个罪犯,盒子是完全一样的。这 100 个盒子随机排列,成一条直线放在一个房间中。
游戏开始,第一个囚犯进入这个房间,选择 50 个盒子打开,如果有对应自己编号的纸条,视为成功,否则失败,然后离开房间到另外一个封闭的房间,盒子全部合上恢复原样。然后第二个囚犯进入,同样选择 50 个盒子打开,依次类推;
游戏开始之前囚犯可以商量制定策略,开始后囚犯没有机会再相互沟通;
如果 100 个囚犯都找到了自己的编号,这些囚犯就算赢了,可以释放。但是如果有任何一个囚犯没有找到自己的编号,则所有囚犯都不能释放;
囚犯应该采取什么策略才能使大家能被释放的几率最大?
简单考虑一下这个问题,能得到几点思路:
1. 如果所有囚犯都随机挑选 50 个盒子,每个人找到自己编号的概率都为 0.5 , 100 个囚犯都找到自己盒子的概率就是 0.5**100, 几乎为 0 ,所以随机选择可以说必输无疑 ;
2. 不管策略如何,由于盒子的排列完全随机,第一个囚犯不管使用什么策略,获胜的几率恒为 0.5 ,所以所有囚犯都选中的概率不可能大于 0.5;
3. 由于策