热门标签 | HotTags
当前位置:  开发笔记 > 人工智能 > 正文

一道经典的黑白帽子问题

题目:黑白帽子问题一百个犯人纵向站成一排,每人头上带上黑色或白色的帽子,各人不知道自己帽子的颜色,但是能看见自己前面所有人
题目:黑白帽子问题

一百个犯人纵向站成一排,每人头上带上黑色或白色的帽子,各人不知道自己帽子的颜色,但是能看见自己前面所有人帽子的颜色。然后从最后边一个犯人开始,每人只能大声说一个字:“黑”或“白”,保证其他人都能听到(但声音中不会附加任何其他信息),如果说中了自己帽子的颜色就存活,说错了就拉出去枪决。在执行前,允许所有犯人可以聚在一起商量策略。那么如果犯人都足够聪明不会犯错,那么100个人最大的存活概率是多少?

分析

由于每个人看不到自己帽子的颜色,所以必需有自己后面的人给自己提供有用的信息才可以存活。好在每个人都可以看到自己前面所有人的帽子颜色,因此提供信息不难。但是尴尬的是,如果提供给前面的人信息,那么自己可能就活不了。同时,在报自己颜色的时候,又很难给别人提供信息。因此,问题的关键是如何在报自己帽子颜色的时候,又可以提供给前面的人以有用的信息,这样才可以保证尽可能多的人活下来。
注:为了讨论方便,所有的顺序都是从后向前,如“第1人”指的是整个一纵排的最后一人,他可以看到前面所有人的帽子颜色。

解法1:存活率 75%

最简单的办法,就是每奇数位人报前一人帽子的颜色,然后前一人再报自己的颜色,以此类推,直到排首。如,第1人能看到第2人的颜色,直接报出来告诉第2人,这样第2人在报的时候直接报出来就可以存活,但是第1个人因为报的是第2个人的帽子颜色,所以只有50%的几率正好与自己的颜色一样。在这种情况下,如果每对的颜色都是一样的,那么100人全部存活;反之,如果每对颜色都不一样,只有50人存活。
存活概率:50人肯定存活,另50人有一半的几率存活,所以存活率为 (100% ×\times× 50 + 50% * 50 )/100 = 75%。

解法2:存活率 96.5%

由于后面的人能够看到所有人的帽子的颜色,所以我们可以利用这一点进行编码。我们很容易求出,100 的二进制码为 ‭1100100 需要7位即可‬,所以我们可以用最后面7个人进行编码对剩下93人的白帽子的数据进行表示。举例来说,比如在前93人中有52顶白帽子,其二进制编码为‭0110100,那么最后7个人可以用黑表示1,白表示0进行报颜色,即 [白,黑,黑,白,黑,白,白]。当前面所有93人听到这个组合时,根据之前商讨的约定,就会明白有52顶白帽子。这是倒数第8人开始报颜色了,虽然他看不见自己的颜色,但是可以看到前面92人的帽子颜色,由于已经知道了白色帽子的数量,所以只要统计一下前面92人帽子的颜色即可推算出自己帽子的颜色,比如数完白色帽子总数仍然是52,自己肯定是黑色的;反之如果白帽子变成51了,自己则也是白帽子。以此类推,直到最后一个人。(注:题目设定所有犯人“足够聪明不会犯错”这点非常关键)。
存活概率:此时93人肯定存活,7人50%概率,所以存活率为 (100% ×\times× 93 + 50% * 7 )/100 = 96.5%。

解法3:存活率 99.5%

本解法利用奇偶性来解决,可以将白帽子的奇偶性作为关键点来考虑。具体算法如下:

  1. 让第1人先统计前99人的白帽子的个数,然后用黑表示奇数,白表示偶数告知前面所有99人。
  2. 下一人根据已经白帽子的奇偶性推算自己帽子的颜色,如果奇偶性改变了,则自己是白色,否则是黑色。
  3. 后面的人根据前人的颜色推断当前白帽子总数的奇偶性,回到2,直到所有人报完。

举例来说,假设总共有52帽白帽子,那么第1人会报白表示偶数。这样所有人都知道了有偶数顶的白帽子。第2人同样会统计前面98人的帽子,如果总数是奇数,白帽子总数的奇偶性由偶变奇了,所以自己也是白色,他报白即可。第3人听到第2人报白,会将当前白帽子总数的奇偶性变成奇数,然后继续进行报。
存活概率:此时99人肯定存活,1人50%概率,所以存活率为 (100% ×\times× 99 + 50% * 1 )/100 = 99.5%。

总结

以上三种算法的结果差异很明显,尤其是最后一种,几乎保证了所有人都可以存活。差异产生的根据原因在于报颜色的时候,是否能够向前面的人提供有用的信息。第一种是每对间的信息完全是独立的,除了前一人的黑白信息对后一人有用外,对其他人完全无用,所以存活率最低。第二种,报颜色的同时还能够向后面所有人提供有用信息,所以保证了93人的存活,但是由于采用二进制的编码的方式,多占用了7人进行编码。第三种方案利用奇偶性只用了1个人就可以向所有人提供了所必需的信息,同时每个人在报的时候也向后面的人提供了有用信息,信息的利用率最高,所以让最多的人活了下来。第三种方案已经是最优解,无法再优化了,因为第1人是无论如何也不知道自己帽子颜色的,只有50%的概率存活,所以99.5%就是这个问题解的极限。


推荐阅读
  • 前端技术分享——利用Canvas绘制鼠标轨迹
    作为一名前端开发者,我已经积累了Vue、React、正则表达式、算法以及小程序等方面的技能,但Canvas一直是我的盲区。因此,我在2018年为自己设定了一个新的学习目标:掌握Canvas,特别是如何使用它来创建CSS3难以实现的动态效果。 ... [详细]
  • 深入解析Java并发之ArrayBlockingQueue
    本文详细探讨了ArrayBlockingQueue,这是一种基于数组实现的阻塞队列。ArrayBlockingQueue在初始化时需要指定容量,因此它是一个有界的阻塞队列。文章不仅介绍了其基本概念和数据结构,还深入分析了其源码实现,包括各种入队、出队、获取元素和删除元素的方法。 ... [详细]
  • 本文探讨了在不同场景下如何高效且安全地存储Token,包括使用定时器刷新、数据库存储等方法,并针对个人开发者与第三方服务平台的不同需求提供了具体建议。 ... [详细]
  • This article explores the process of integrating Promises into Ext Ajax calls for a more functional programming approach, along with detailed steps on testing these asynchronous operations. ... [详细]
  • 深入理解MongoDB的SCRAM-SHA-1认证流程
    本文详细解析了MongoDB的SCRAM-SHA-1认证机制的具体步骤,旨在帮助读者深入了解这一安全认证方法的工作原理及其在实际应用中的重要性。 ... [详细]
  • Web开发实践:创建连连看小游戏
    本文详细介绍了如何在Web环境中开发一款连连看小游戏,适合初学者和技术爱好者参考。通过本文,您将了解游戏的基本结构、连线算法以及实现方法。 ... [详细]
  • 本文介绍了如何通过 ADB 命令行工具启动和停止 Android 应用。通过简单的命令,您可以轻松地控制设备上的应用运行状态。 ... [详细]
  • 本文介绍了如何使用jQuery获取浏览器窗口的可视区域高度、文档的整体高度以及宽度等关键尺寸信息,包括边界、填充和边距在内的完整尺寸。 ... [详细]
  • SPFA算法详解与应用
    当图中包含负权边时,传统的最短路径算法如Dijkstra不再适用,而Bellman-Ford算法虽然能解决问题,但其时间复杂度过高。SPFA算法作为一种改进的Bellman-Ford算法,能够在多数情况下提供更高效的解决方案。本文将详细介绍SPFA算法的原理、实现步骤及其应用场景。 ... [详细]
  • 本文详细介绍了Socket在Linux内核中的实现机制,包括基本的Socket结构、协议操作集以及不同协议下的具体实现。通过这些内容,读者可以更好地理解Socket的工作原理。 ... [详细]
  • 探索CNN的可视化技术
    神经网络的可视化在理论学习与实践应用中扮演着至关重要的角色。本文深入探讨了三种有效的CNN(卷积神经网络)可视化方法,旨在帮助读者更好地理解和优化模型。 ... [详细]
  • 我整理了HMOV四大5G旗舰的参数,可依然没能拯救我的选择困难症
    伊瓢茕茕发自凹非寺量子位报道|公众号QbitAI报道了那么多发布会,依然无法选出要换的第一部5G手机。这不,随着华为P40系列发布,目前国 ... [详细]
  • 最优化算法与matlab应用3:最速下降法
    最优化算法与matlab应用3:最速下降法最速下降法是一种沿着N维目标函数的负梯度方向搜索最小值的方法。(1)算法原理函数的负梯度表示如下:搜索步长可调整ak,通常记为(第k次迭代 ... [详细]
  • Java高级工程师学习路径及面试准备指南
    本文基于一位朋友的PDF面试经验整理,涵盖了Java高级工程师所需掌握的核心知识点,包括数据结构与算法、计算机网络、数据库、操作系统等多个方面,并提供了详细的参考资料和学习建议。 ... [详细]
  • 本文探讨了在 Python 2.7 环境下,如何有效地对大量数据(如几百 KB 的字符串)进行加密和压缩,并确保能够准确无误地解密回原始数据。 ... [详细]
author-avatar
mobiledu2502881483
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有