昨日问题

这道题来源于读者投稿,解法来源于知乎。

很显然,每个囚犯最多打开50个抽屉,抽中自己号码的概率是1/2。但是我们有100个囚犯,这100个囚犯都找到自己号码的概率就是2的一百次方分之一。咱们也不必要去计算这个值,显然是一个天文数字。

那么有没有更好的策略呢?

其实是有的,并且非常巧妙,巧妙到几乎很难想到。策略是对于囚犯i,他首先打开i号抽屉,如果i号抽屉当中就是i,显然他成功找到了。假设抽屉当中是号码j,那么他继续打开j号抽屉,重复上述过程,直到找到了号码i或者是用完了50次机会。

比如在这个例子当中,所有人都可以在用完机会之前找到自己的号码。

那么这种操作的原理是什么?

原理就是找环,我们把问题进行抽象和转化。首先我们把抽屉上的号码看成是起始点,把抽屉里的卡片号码看成是终点。这样我们就连出了一条有向边,比如1号抽屉里是7号卡片,我们就得到了一条从1指向7的边,一共有100个抽屉100张卡片,所以就有100个点和100条边。

再加上每个点的入度和出度都是1,那么根据图论中点和边的性质,我们可以确定,每一个点都在环当中。那么剩下的就很好办了,环是确定的,不确定的就是环的大小。

对于一个确定的点i来说,它所在的环长度可能是1也可能是100。只要大于50,我们就无法找到解了。

那么这个概率应该怎么算呢?

首先,可以确定的是如果存在长度大于50的环,这个环一定只有1个。我们假设它的长度是L,那么,这个环的构成情况一共有C(100, L)种,这里的C表示组合数。对于每一种组合来说,一共有(L-1)!种排列,因为是一个环,所以不是L!。

这个环之外的元素有100-L个,它们的排列有(100 - L)!种。对于每一个L都有C(100, L) * (L-1)! * (100 - L)!=100!/L种情况。而100个数的总排列是100!,所以我们可以得到所有囚犯都猜对的概率是:

这里的计算看起来复杂,其实用到的只是小学的奥数排列组合的知识。不管怎么说,从结果上来看,这个概率显然比瞎猜要大得多的多了。

今日问题

拜占庭将军问题

拜占庭帝国为了征讨一座城堡派出了7个将军各自率领一个队伍,这个城堡非常坚固,必须要有一半以上的将军一起进攻才可以获胜,否则将会失败。由于科技落后,将军之间只能通过传令兵进行通信。

将军之间约定各自发出是否进攻的投票,如果收到进攻的意见超过半数则发起进攻。但由于7个将军当中混入了2个叛徒,叛徒会发出虚假的指令,比如向决定进攻的将军发送进攻,向想要撤退的将军发出撤退。比如3个忠诚的将军下令进攻,2个将军下令撤退,这时两个叛徒向3个忠诚的将军发送进攻,向2个想要撤回的将军发送撤退,这样将会导致实际进攻的将军只有3个,这会导致战争的失败。

假设现在将军们已经发现了叛徒的存在但不知道是哪两个将军是叛徒,忠诚的将军们应该采用什么样的方法才可以保证做出的决策不被叛徒影响?

java实现拜占庭将军_每日一题 | 拜占庭将军问题相关推荐

  1. Java实习生常规技术面试题每日十题Java基础(七)

    目录 1. Java设计模式有哪些? 2.GC是什么?为什么要有GC? 3. Java中是如何支持正则表达式. 4.比较一下Java和JavaSciprt. 5.Math.round(11.5) 等于 ...

  2. Java实习生常规技术面试题每日十题Java基础(八)

    目录 1.解释内存中的栈(stack).堆(heap)和静态区(static area)的用法. 2.怎样将GB2312编码的字符串转换为ISO-8859-1编码的字符串? 3.运行时异常与受检异常有 ...

  3. Java实习生常规技术面试题每日十题Java基础(四)

    目录 1.String 和StringBuffer的区别. 2.数组有没有length()这个方法? String有没有length()这个方法? 3.final, finally, finalize ...

  4. Java实习生常规技术面试题每日十题Java基础(五)

    目录 1.启动一个线程是用run()还是start()? . 2.线程的基本状态以及状态之间的关系. 3.Set和List的区别,List和Map的区别? 4.同步方法.同步代码块区别? 5.描述Ja ...

  5. Java实习生常规技术面试题每日十题Java基础(一)

    目录 1.Java 的 "一次编写,处处运行"如何实现? 2.描述JVM运行原理. 3.为什么Java没有全局变量? 4.说明一下public static void main(S ...

  6. Java实习生常规技术面试题每日十题Java基础(六)

    目录 1.在Java语言,怎么理解goto. 2.请描述一下Java 5有哪些新特性? 3.Java 6新特性有哪些. 4.Java 7 新特性有哪些. 5.Java 8 新特性有哪些. 6.描述Ja ...

  7. Java实习生常规技术面试题每日十题Java基础(二)

    目录 1. JAVA 的反射机制的原理. 2.静态嵌套类(Static Nested Class)和内部类(Inner Class)的不同? 3.如何将String类型转化成Number类型. 4.什 ...

  8. Java实习生常规技术面试题每日十题Java基础(三)

    目录 1.是否可以从一个static方法内部发出对非static方法的调用? 2.Integer与int的区别? 3.Overload和Override的区别.参数列表相同,返回值不同的方法,是否是重 ...

  9. 防抖 节流_每日一题手写函数防抖与节流

    关注"前端学苑" ,坚持每天进步一点点 「~函数防抖与节流 ~」 每日一题,希望让爱学习.思考的前端技术伙伴在一起学习.复盘.成长. 基础知识要夯实,原理源码要深入,深度广度要扩展 ...

最新文章

  1. 软件开发面试_如何为成功的软件开发工作面试做准备
  2. CVPR2020 best paper:对称可变形三维物体的无监督学习
  3. 航天智慧物流!智能汽车竞赛—航天赛道开始报名啦!
  4. Function Two
  5. .NET静态类的概念
  6. nginxlua文件服务器权限,通过lua进行nginx的权限控制
  7. MyFlash——美团点评的开源MySQL闪回工具
  8. WPF中的命令与命令绑定(二)
  9. html页面如何接受提示参数,html页面如何象asp一样接受参数_javascript教程
  10. kotlin中的异常处理_Kotlin异常处理
  11. 清除Outlook 2013中缓存的邮件地址
  12. 第一次作业(构建之法8,16读后感)
  13. 解决Linux操作系统下SSH等终端乱码问题
  14. 解决发邮件出现“501 Domain address required: HELO”问题
  15. 如何解决金山词霸与卡巴斯基的冲突问题
  16. 西威变频器avo下载调试资料_全程图解变频器应用与检测技能
  17. f12获取网页文本_【教程】如何抓取动态网页内容
  18. 高通apq8098平台sd卡总结
  19. /usr/bin/xauth: file /home/wj/.Xauthority does not exist
  20. rop检查_【国际高影响力文章红毯秀7月】白内障扩瞳安全性、ROP筛查新标准、45mmHg眼内灌注压...

热门文章

  1. 聚合热搜热榜PHP接口API源码
  2. C#笔记——【面向对象实战】(一)基于OPP设计新体育彩票选号器
  3. 一年赚一百万的思路—别做大多数的傻瓜
  4. !和~的区别(逻辑取反和按位取反)
  5. J1-20:《英语辅导系统》关键算法
  6. cannot import name ‘escape‘ from ‘jinja2‘
  7. 了解Android Studio中的Gradle
  8. 盘点企业直播公司的选择误区
  9. 无名创新无人机调试架——多旋翼调试平台(萌新炸机终结者)
  10. 阿里巴巴大数据之路读书分享