今天在论坛看到一题目 国王和100个囚犯 http://www.iteye.com/topic/569275
大概在去年,朋友问过过我这个问题。
方案比较简单:
首先,第一天出来的人,担当“计数者”,它把灯开起来(原来开着就不必动了)
然后每天出来一个囚犯。
如果他不是“计数者”,并且没有关过灯, 并且灯开着, 那么就把灯关了。
如果他是“计数者”, 如果灯关了, 就把他开起来(计数+1)。 当然如果灯被关了99次, 那么就去和国王说吧。
但显然也是一个概论问题, 因为每次出来的囚犯随机,
现在问题是, 如果采用这个方案, 大概他们多久可以出来?
先不忙着用数学进行计算, 我们用程序统计平均天数:
首先, 进行一次实验的天数是这样的:
public static int escapeDays() {
Random rand = new Random();
int days = 1; // 第一天
int counter = rand.nextInt(100); // 出来一个 计数者
boolean light = true; // 开灯
List<Integer> 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个囚犯.doc
该存储库包含用于模拟100名囚犯和一个灯泡问题的代码。 问题 有一个监狱,院子里有可以由囚犯打开或关闭的灯。 有100个囚犯被单独监禁,这意味着他们不能彼此互动,也不能从外界获得任何感官信息。 入狱时,灯泡将...
解决问题
n个死囚犯围成一圈,编号1至n,从1开始报数,报到数m时,执行枪决,接着重新报数,继续上述操作,直至剩下最后一个囚犯,给出最后一个囚犯的编号
在2015年收集的样本中,有两个成人教育班级相当于一个中学水平(A级为23名犯人,B级为12名犯人,全部为男性),位于一个教养所。 使用问卷。 网络分析软件(Visone)和常规统计信息(SPSS)用于计算网络变量(in...
某国王对囚犯进行大赦,让一狱吏n次通过一-排锁着的n间. 牢房,每通过一-次按所定规则转动n间牢房中的某些门锁,每转 动一次原来锁着的被打开,原来打开的被锁上通过n次后,门锁 开着的,牢房中的犯人被放出,否则,...
每天,监狱长随机挑选一个囚犯,然后那个囚犯访问房间。 囚犯可以切换灯泡。 囚犯可以选择断言所有 N 个囚犯现在都到过房间。 如果此断言为假,则所有 N 个囚犯都被枪杀。 否则,所有囚犯都将被释放。 这个问题有...
古代某法官要判决IV个犯人的死刑,他有一条荒唐的法律将犯人站成一个圆圈,从第s个人开始数起,每到第D个人就拉出来处死,然后再数D个,再拉出来处决…… 直到剩下最后一个可以赦免. function getNum($n,$m){ //用于把...
有8个犯人,为防止他们串供,必须把有牵连的犯人互相隔离,问至少需要几个关押室,给出计算方法与程序。已知有牵连的情况如下表: 犯人 有牵连的犯人 A B C D E F G H B C E G A C H A B D C E H A D F H F G A F H...
研究人员发现每个自变量(MA,SSQ,SE和SR)与因变量(巴基斯坦的社会囚犯现象)之间的关系很弱。 因此,最后发现,巴基斯坦的社会监狱要素与社会囚犯现象之间存在适度的关系。 因此,可以肯定地说,21世纪的人确实...
博弈论模拟这是一个模拟和可视化囚犯困境的项目。 它实现了Nowak&May(1992)提出的空间囚徒困境游戏[1]。细节在此模型中,座席被放置在网格中,在每一轮中: 每个人都通过与其所有近邻及其本人进行囚徒困境游戏来...
囚犯逃跑问题的java解决方法,事先可以设定囚犯人数与测试次数。
网络游戏-基于Zigbee无线网络和GPRS无线网络的犯人监控系统.zip
小学数学数学神探哪个是犯人
元首与囚犯_人生故事.pdf
信息时代的“囚犯”.pdf
索引重建该服务维护在代码中称为INDEX_A和INDEX_B两个索引prison-search-index-a和prison-search-index-b 。 在正常运行中,这些索引中的一个将处于“活动”状态,而另一个则处于Hibernate状态且未使用。 当我们准备...
用单向循环链表实现了对点杀罪犯问题(约瑟夫问题)的处理。
监狱犯人自动考勤系统解决方案.doc
迅雷上机笔试软件测试凭印象了:算法题:1.连接两个单向链表,返回排序后的结果。2.一个保存有10000个URL的文本文件,删除其中相同的URL。3.将9个石子放在9x9的方格中,要求...国王给三个囚犯每人戴了一顶帽子,帽子不