码迷,mamicode.com
首页 > 其他好文 > 详细

囚犯问题

时间:2014-11-16 21:41:45      阅读:312      评论:0      收藏:0      [点我收藏+]

标签:囚犯问题 协议设计

邪恶而心思缜密的典狱长最近心血来潮,于是召集了100个囚犯。望着眼前的囚徒,他的嘴角弯起了一个得意的弧度:

“宣布一个好消息,大家有机会获释了。”

“我们一起做个轻松愉快游戏,赢的人可以立即走出这里。"

"说下游戏规则吧。游戏开始后,我会把你们随机排成一列。然后给每个人背上贴一张纸条,黑色或者白色。规矩是,后面的人能看到前面人的颜色,但是前面的人不能回头看后面的人,更不能看自己的纸条。一旦发现违规,——全部处死。游戏开始以后,每个人从后往前依次报出自己的颜色。当让了,前面的人能听到后面的人说了什么。如果说对了,给你自由;说错的话,处死!”

底下人潮涌动。

欣赏着各色表情,狱长先生继续说:"呵呵,刚才与诸位开个玩笑。只不过,猜错的某位,要劳烦在这里多待一个寒暑罢了。”

随即,目光下沉:“但要记住,只能报‘黑’或‘白’。多说一个字,立即处死。"

“明早,这里集合;9点钟,游戏开始。先生们,能获得多少自由,就看你们自己的了,不要让我失望哦。”


那么问题来了,这群囚犯应该商量一个什么样的对策,才能让自己获释的机会最大呢?

如果每个人随机回答自己的颜色,所有的人只有五成的机会。

如果后面的人报出前面一个人的颜色作为提示。前面一个人可以确保自由,后面的人仍然只有一半的机会。总体上有75%的机会。

是否还有更好的方法呢?

这个方法是存在的,而且好到可以让前面的99个人自由,后面的一个人有一半的机会自由,总体上达到99.5%的成功率。

那么这个策略是什么样的呢?







看下已知量是什么:

1)每个人可以看到前面的人,也可以听到后面的人。如果后面的人报的颜色是正确的话(最后一个人除外),他可以知道:除了他以外,其他人的帽子颜色

2)游戏开始以后,所有人的帽子颜色值是一定的。这是一个不变量。


黑色用1表示,白色用0表示。

最后一个人可以看到前面99个人有多少个1(黑色)。如果是奇数个,他就报1(黑色),如果是偶数个,就报0(白色)。

前面的听到最后一个人的暗示以后,就知道自己这99个人当中黑白的奇偶j;当然他也知道其他人帽子颜色。所以就可以推测出自己的颜色。


举个例子:

6个人从前往后帽子颜色是:

0 1 0 1 1 0

最后一个人看到有3个1,于是就报1,发出暗示。当然他也就牺牲小我,成就大我。

第5个人看到前面有2个1,于是知道自己也是1,就报1(黑色)。

第4个人听到第5个人是黑色,也看到前面3个人有1个黑色,加起来是2个黑色,所以自己必然是黑色。

第3个人可以知道前5个人中,除了自己有3个黑色,于是知道自己是白色

依次类推,前5个人都可以准确猜出自己的颜色。


如果是100个人,依此进行。



把这个问题进行抽象,我们实际上要对前99个值做一个运算,得到的值{0,1}作为最后一个人的暗号

这个运算函数是F, F(B1, B2, ...,B99)的值就是B100

最后每个人i可以通过B100,以及{Bk, k不等于i}这个集合,做F的逆运算,然后得到自己的值。

我们的目标就是找到这个函数F

最后我们找到的这个函数F就是:计算集合{Bi, 1<=i<=99}中1的奇偶性。奇数用1表示,偶数用0表示。

用计算机当中的位运算来说说,这是一个异或函数。


囚犯问题

标签:囚犯问题 协议设计

原文地址:http://blog.csdn.net/kingoverthecloud/article/details/41172117

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!