大概在去年,朋友问过过我这个问题。

方案比较简单:

首先,第一天出来的人,担当“计数者”,它把灯开起来(原来开着就不必动了)

然后每天出来一个囚犯。

如果他不是“计数者”,并且没有关过灯, 并且灯开着, 那么就把灯关了。

如果他是“计数者”, 如果灯关了, 就把他开起来(计数+1)。 当然如果灯被关了99次, 那么就去和国王说吧。

但显然也是一个概论问题, 因为每次出来的囚犯随机,

现在问题是, 如果采用这个方案, 大概他们多久可以出来?

先不忙着用数学进行计算, 我们用程序统计平均天数:

首先, 进行一次实验的天数是这样的:

public static int escapeDays() {

Random rand = new Random();

int days = 1;// 第一天

int counter = rand.nextInt(100); // 出来一个 计数者

boolean light = true; // 开灯

List list = new ArrayList();// 计数者知道关灯的次数 为 list.size()

while (true) {

days++; // 又过了一天

int prison = rand.nextInt(100); // 出来一个囚犯

if (prison == counter) { // 如果是计数者

if (list.size() == 99) { // 成功啦

break;

}

if (!light) { // 灯关了,就把它开起来

light = true;

}

} else {

if (light && !list.contains(prison)) {// 如果没有关过灯,并且灯开着

light = false; // 就把它关了

list.add(prison);

}

}

}

return days;

}

然后我们让实验进行一万次。

public static void main(String[] args) {

int times = 10000; // 统计平均天数, 我们把这个实验做一万次

int days = 0;

for (int i = 0; i < times; i++) {

days += escapeDays();

}

System.out.println("平均需要的天数:" + days / times);

}

在我的电脑上输出:

平均需要的天数:10428

差不多是  28 ~ 29 年时间。超过无期徒刑了, 国王还真会玩, 要是被囚犯们知道, 直接撞墙自杀了。

让我们再用数学去计算一下:

首先,第一天出来的是“计数者”, 这是一个必然事件, 没啥好说的。

从第二天开始, 我们要完成以下过程 99 次

出来一个新的囚犯, 然后等待“计数者”出来把灯开起来。

第一次出来新的囚犯的概率是: 99 / 100 --- 除去计数者, 其他任何囚犯出来都满足要求

完成这一步的平均时间是 100 / 99  天

完成上面这个过程后,接着要求“计数者”出来,开灯。 这个概率是 1 / 100

完成这一步的平均时间是 100 天

第二次, 新囚犯出来的概率是 98 / 100

完成这一步的平均时间是 100 / 98

计数者出来的率还是 1 / 100

完成这一步的平均时间还是 100 天

...

第99次, 新囚犯出来的概率是 1 / 100 (只有一个囚犯没有出来了)

计数者出来的率还是 1 / 100

然后我们把时间加起来:

100 / 99 + 100 + 100 / 98 + 100 + ... 100 / 1 + 100

=  100 * 99 + 100 * (1 / 99 + 1 / 98 + 1 / 97 + ... + 1)

=  9900 + 100 * (1 + 1 / 2 + 1 / 3 + ... 1 / 99)

呼呼, 上面 1 + 1 / 2 + 1 / 3 + ... 1 / 99 这是一个调和级数 大概等于 ln 99 + 1 ,

当然可以用程序 很容易求得 值为: 5.177

所以上述值为: 10417

和上面程序测试10000次的值吻合!

100个囚犯和灯泡C语言,关于国王和100个囚犯相关推荐

  1. 程序设计囚犯与灯泡 C语言代码,100个囚犯和灯泡的那些事儿(下)

    即使灯泡的初始状态不定,当 n=2 时,两个人也能保证都知道对方进过房间.假设双方手中各有两个球,囚犯 A 总是试图把自己的小球放进盒子,囚犯 B 总是试图把小球取走.如果 B 拿到了 4 个小球,他 ...

  2. c语言求100以内偶数和while,c语言 求1到100以内的偶数之和

    满意答案 npiim 2013.05.24 采纳率:57%    等级:12 已帮助:7545人 答:一.临界考虑错误... 考虑当·i·等于98的结束后·· ··这个循环里面的b是为99···· · ...

  3. c语言100以内分解质因数,用C语言实现,将100以内的自然数分解质因数

    仅供参考,尽管是C# //****************************************************************************** // Autho ...

  4. C语言100个囚犯和灯泡,一百个囚犯和一个灯泡

     这是一个策略设计博弈谜题.说的是"囚犯与灯泡"的问题. 有100个囚犯分别关在100间牢房里.牢房外有一个空荡荡的房间,房间里有一个灯泡,以及控制这个灯泡的开关.初始时,灯是关 ...

  5. C语言100个囚徒和灯泡,经典算法问题其一:百日囚徒问题

    开始更新博客啦~   计划每周研究一道算法问题,并给出解决方案和代码实现(python),欢迎大家提出看法和意见,有更优的解决方案更是强烈欢迎. 这次的问题是几天前看到的一个算法问题,先是自己想了半天 ...

  6. 趣味算法:国王和100个囚犯

    前几天在网上看到了一个有趣的问题,就是 国王和100个囚犯 的问题.第一次看到这个问题时,当时也懵了,这是什么鬼?你确定你题出的木有问题?当时就是这感觉- 但仔细思索后还是想到了解决方法,让我们一起来 ...

  7. 单片机c语言程序设计实训报告,(整理)单片机C语言程序设计实训100例.doc

    (整理)单片机C语言程序设计实训100例.doc .单片机C语言程序设计实训100例基于8051Proteus仿真案例第 01 篇 基础程序设计01闪烁的LED/* 名称闪烁的LED说明LED按设定的 ...

  8. c语言错误 xef代表什么,单片机C语言代码手册 含100多个经典C程序

    1 单片机单片机 C 语言代码手册语言代码手册 1 LED 灯灯 点亮一个点亮一个 LED include void main while 1 P0 0 x01 P2 0 x7d 流水灯闪烁流水灯闪烁 ...

  9. C语言循环求出2的10次幂,C语言求2的100次幂的结果.doc

    C语言求2的100次幂的结果 求2的100次幂的结果 #include #include #include #include void main void int a,b,i; char s[40], ...

最新文章

  1. java 8大数据类型
  2. mxnet中的SoftmaxCrossEntropyLoss损失函数
  3. linux超级基础系列——shell变量(本地变量和环境变量)
  4. sql server密钥
  5. 带你一起学kivy第一天
  6. ThinkPHP 3.2.2 在 volist 多重循环嵌套中使用 if 判断标签
  7. NSAutoReleasePool使用中drain和release的区别
  8. C#调用C++ memcpy实现各种参数类型的内存拷贝 VS marshal.copy的实现 效率对比
  9. 4.4 IPv6(诞生原因、数据报格式、与IPv4的不同、地址表现形式、基本地址类型、IPv6与IPv4的过渡策略)
  10. java poi读取word中附件_Java POI导入word, 带图片
  11. 【转载】固态硬盘的S.M.A.R.T详解
  12. 国内外最佳的photoshop教程网站推荐
  13. win7 局域网共享文件
  14. 国际电话登机英文术语
  15. python爬取起点vip小说章节_python 爬取qidian某一页全部小说
  16. 科学家被称为计算机之父,被称为“计算机之父”,他超前的思维揭开计算机处理信息的本质!...
  17. 互联网和大数据是什么意思_互联网包括大数据吗 大数据与互联网的关系是什么...
  18. FITS基本文件格式
  19. 黑客常用dos命令详解
  20. elementUI动态菜单

热门文章

  1. Python正则表达式中的贪婪和非贪婪
  2. Docker 操作命令 整理
  3. jQuery框架学习第八天:ASP.NET jQuery实施方案
  4. NHibernate笔记Ⅲ--关于EF和NH的比较
  5. 漫步最优化十五——凸函数优化
  6. scikit-learn中随机森林使用详解
  7. oracle listener启动问题
  8. leetcode二分查找
  9. 【蚁剑的安装与使用+例题实战】【CTF】webshell
  10. 【CCS2018】SDN跨应用中毒攻击