如何知道自己有没有戴绿帽子

开发 前端 后端
三个逻辑学家走进酒吧,侍者问:"每个人都要来杯啤酒吗?"第一个逻辑学家说:"我不知道。"第二个说:"我也不知道。"第三个说:"是的!"

三个逻辑学家走进酒吧,侍者问:"每个人都要来杯啤酒吗?"第一个逻辑学家说:"我不知道。"第二个说:"我也不知道。"第三个说:"是的!"

这是一个经典的低笑点段子,相信大多数人稍稍思考片刻,就可以恍然大悟:对于侍者的问题,三个人只要有一个人答案为否,整个问题的答案就是否,第一 个逻辑学家如果自己心里想要啤酒,但是不知道其他两个人的意向,只能回答不知道,相反,如果他自己心里不想要啤酒,就可以直接回答否,不用再看其他两个人 的意向。第二个逻辑学家也是类似的情形,不知道第三个逻辑学家的意向,只能回答不知道。轮到了第三个逻辑学家,他从前两个逻辑学家的回答中已经可以判断出 前两个人都要啤酒,而他自己也要啤酒,于是最终才给出侍者的问题的答案:"是的!"。

其实此类的逻辑游戏还有很多更好玩的,跟"戴绿帽子"有关系的那些逻辑故事就很有趣。

[[75547]]

版本1

假设在监狱里有一百个囚犯,他们即将被执行死刑,不过在最后时刻,执行官给了他们一次活命的机会。执行官让一百个囚犯前后站成一排,然后给每个人带 上一顶帽子,帽子是红色或者绿色的,两种帽子的可能性各有一半,每个囚犯都看不到自己头上帽子的颜色。然后执行官掏出枪来,从站在排尾的那个囚犯开始," 一个一个过筛子",逐一要求每个囚犯说出一种颜色,红色或者绿色,如果说对了就可以绝处逢生,如果说错了,砰一声,立刻枪口对准脑袋一枪解决。执行官还强 调:"你们回答我问题的时候,只准说红色或者绿色,说任何多余的话立刻就地正法。"看来在这个游戏中,有没有带绿帽子可是事关生死的大事情。

表面上看起来,在这种情况下,每个囚犯虽然能看到自己前面的人帽子的颜色,却看不到自己头顶上的帽子是红色还是绿色的,只能乱猜一个,听天由命了, 平均100个人里能有50个活下来。有人会说如果每个人说帽子颜色的时候都说前面一个人的帽子的颜色,暗中起了提醒作用,情况会不会好一些?对于排位的最 后一个人来说,这样做无妨,可以让倒数第二个人知道自己帽子的颜色。不管之后排尾那个人被崩掉了还是活下来,轮到倒数第二个人的时候,他已经在心里知道自 己帽子的颜色(比如红色),如果他前面的人,也就是倒数第三个人的帽子也是红色,他喊一声红色既可以救自己的命,就可以通知前面的人。可是如果事情走向另 外一半的可能:倒数第三个人的帽子是绿色,对于倒数第二个人来说,舍己为人或者舍人为己,让自己活就不能提醒前面的人,提醒前面的人自己就没命了。事实 上,即使每个人都舍己为人提醒前面的人,总的生还比例并不会增加。

100名囚犯除了接受以扔硬币的方式死亡以外,有没有更好的办法呢?当然有,而且可以保证100个人里有多达99.5个人活命,而不是50个。

99个是指除了排尾最后一个人以外的99个人,0.5个人是指排尾的那个最不幸的家伙也有1/2的可能性活命。

办法是这样:所有的囚犯要团队合作。规则1:从倒数第一个人开始,数一下前面的所有人戴绿帽子的个数是奇数还是偶数,如果是奇数,就说绿色;如果是 偶数,就说红色。规则2:从倒数第二个人开始,在思考自己应该说的颜色同时,还要仔细听一下前面的人说过的颜色,如果一共有奇数个人说过绿色,就改变自己 按照规则1原本要说的颜色;否则正常说出规则1的颜色就可以。

只要按照这样,每个人既可以说出自己头顶帽子的颜色,还可以为前面的同伴提供信息,那个执行官只好无奈的放走所有的犯人。

举个例子:假设一共四个囚犯,从后向前,红帽子,绿帽子,红帽子,绿帽子,倒数第一个囚犯看到前面有偶数个绿帽子(2个),说红色,自己可以活命; 倒数第二个人看到前面有奇数个绿帽子(1个),后面0个人说过绿色,于是喊绿色,也活命了;正数第二个人看到前面有奇数个绿帽子(1个),本应喊绿色,但 是后面有1个人喊过绿色,于是喊红色,也可以得救;轮到最前面的那个囚犯,前面绿帽子为0,本应喊红色,但是同样因为前面有人喊过一次绿色,改喊绿色,也 和自己帽子颜色一致。最后四个人都可以生还。

版本2

如果游戏不是一长排从后向前逐个人说出帽子的颜色,而是所有人在同一个瞬间说出,而且所有人要死一起死,要活一起活。具体是这样的,每个人可以选择 说红色,绿色或者沉默不语,但是必须保证没有人说错自己头顶帽子的颜色,而且至少有一个人说对自己头顶帽子的颜色,才算过关(也就是说所有人如果都保持沉 默照样要被枪决),所有人都可以活命,否则后果你懂得。

在这种情况下每个人都不可能在瞬间知道自己头顶上有没有绿帽子,似乎也无计可施了吧,这回真的要看运气了吧。其实并不是这样的,我们假设最简单的情况,一共只有三个囚犯,可以有一种策略保证他们在75%的时候可以活命。

方法很简单,三个囚犯在同时猜的时候按照这样的规则:如果看到另外两个人帽子颜色不一样,保持沉默,如果另外两个人帽子的颜色都是红色,喊绿色;如果另外两个人帽子颜色都是绿色,喊红色。

三个人A,B,C的帽子颜色组合一共有下面这八种:

A B C 结果
挂了
绿 得救
绿 得救
绿 绿 得救
绿 得救
绿 绿 得救
绿 绿 得救
绿 绿 绿 挂了

按照以上的策略,在所有的八种情况的六种下,三个苦逼的囚犯都可以保住性命。这似乎有点和概率相违背,因为无论怎么猜,是同时进行的,每个人都不知 道自己头顶帽子的真正颜色,对于确定的某一个人来说,假设说绿色,自己头顶的帽子是红色和绿色的可能性各占50%,这意味着在一种情况下的正确的答案,在 另外一种相反的情况下就是错误的答案。

按照规则每次只要有一个人说对,其他两个人沉默就可以完成任务,要是八种情况下有六种情况脱险,需要一共有六次说对,但同时也意味着在其他情况下有 六次说错。我们可以设法"编码",把说错的6次都集中在一起,在剩余的两种情况中(全是红色,全是绿色)一错到底。这正是以上提到策略的初衷,在75%的 时候保证每次有一人说对,在剩下25%的时候让每个人都说错,这样总的说错次数和说对次数相等,但是生还的概率却远超过一半。事实上,对于3个人的情 况,75%概率也已经是可能的最好结果。

如果游戏有更多的囚犯参加,他们一起生还的机会还可以更高,如果有N = 2^n – 1 个人参加, 他们使用最佳的策略活命的机会将是N/(N + 1) = (2^n – 1)/2^n,如果7个囚犯参加,活命的机率将是87.5%,如果15个囚犯参加,活命的机率将是15/16=93.75%。

7个人玩游戏的时候道理还是同样的,他们帽子颜色的组合将会一共有2^7=128种可能性,在这128中里面我们最多可以保证有112种情况下有一 个人才对,其他人全部沉默不语;然后在剩下的16种情况下,所有人全部去猜,而且全猜错,16*7=112,猜错的次数和猜对的次数还是相等的,不与概率 计算相违背。不过策略具体执行起来就不是用一两句话就能说清楚的了,需要首先给七个囚犯用二进制遍上号000,001一直到111,然后每个囚犯在决定是 不是要喊,喊红色还是绿色的时候,要根据其他人帽子的颜色和对应的编号,进行二进制的计算,应用的是通信上的Hamming Code纠错码方式,详情可以参看:

http://www.math.vt.edu/people/brown/doc/dozen_hats.pdf

虽然计算复杂了一点,但是可以保证所有的人以最大的概率活命,也算值了,当然如果囚犯都不是逻辑学家和程序猿,数学没死理性派这么好,估计活命有点难。

原文链接:http://songshuhui.net/archives/81591

责任编辑:陈四芳 来源: songshuhui.ne
相关推荐

2019-03-14 08:47:49

Visual Stud数据开发

2009-09-17 22:20:07

2020-08-25 10:16:59

漏洞白帽网络安全

2024-01-15 07:14:37

kubernetesk8sLTS

2009-11-25 09:11:30

2024-03-20 08:12:12

分库分表数据

2015-03-11 13:50:51

2011-06-13 14:04:32

容错服务器HA

2021-02-02 09:59:22

接口前端通用

2019-12-06 14:50:49

APP录音隐私

2021-08-27 16:36:08

人工智能AI

2015-12-15 09:39:45

主宰世界主算法

2019-06-03 15:44:25

SSD固态硬盘内存

2016-11-15 18:57:15

2018-08-29 11:15:50

Linux软件包命令

2015-09-06 14:12:49

2009-10-19 14:07:56

博科资讯傻瓜式管理管理软件

2015-04-09 13:32:16

编程编程前途

2018-11-21 14:52:35

2020-08-17 08:39:36

API监控
点赞
收藏

51CTO技术栈公众号