`
bencode
  • 浏览: 109629 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

关于国王和100个囚犯

 
阅读更多

今天在论坛看到一题目 国王和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次的值吻合!

 

 

分享到:
评论
11 楼 yanghao0 2010-01-21  
开始 2010-01-21 17:56:30
运行2次,囚犯共100人
最小的是:9808天
最大的是:9959天
结束 2010-01-21 17:58:26

--
代码附件,可运行

请提意见
10 楼 bencode 2010-01-20  
哦,对, 我上面的方案有问题。
是我欠考虑,对不起:)

我晚上再好好想想,想不明白,再去看你的解决方案哈。谢谢。
9 楼 dch1287 2010-01-19  
bencode 写道
比如我就是那个“计数者”,我是在15分钟内被大伙指定的。

然后某一天,我第一次被放出来。我不管灯是否开关。 我只要这次让灯开着。。

然后计数, 我只要以后出来。看到灯被关掉99次。 就可以了。

因为每个犯人只允许关灯一次。



一开始灯开着

第一天 某个其他人被放出来 按照大家商量的 他打关了灯 并且从今以后他再也不关了

某天你第一次被放出来 你看到灯关着 然后你打开了他 从这天起 你最多只能看到灯被关掉98次
8 楼 bencode 2010-01-18  
国王当然要知道一天一天,因为他还要等每一天叫他的守卫去放人。。
7 楼 bencode 2010-01-18  
比如我就是那个“计数者”,我是在15分钟内被大伙指定的。

然后某一天,我第一次被放出来。我不管灯是否开关。 我只要这次让灯开着。。

然后计数, 我只要以后出来。看到灯被关掉99次。 就可以了。

因为每个犯人只允许关灯一次。

6 楼 dch1287 2010-01-18  
dch1287 写道
bencode 写道
那就在商量的时候。指定一个“计数者”

过程就从他出来的时候开始进行。这大概要多上一百天。

"从他出来的时候开始进行" ?? 他如何知道自己是什么时候出来的,如果不知道,那么灯的初始状态就有关系了!!

最后要完成任务的是囚犯,而不是国王。国王知道有什么用?
5 楼 dch1287 2010-01-18  
bencode 写道
那就在商量的时候。指定一个“计数者”

过程就从他出来的时候开始进行。这大概要多上一百天。

"从他出来的时候开始进行" ?? 他如何知道自己是什么时候出来的,如果不知道,那么灯的初始状态就有关系了!!
4 楼 bencode 2010-01-18  
囚犯不知道时间没关系,国王知道就行了。

引用

这所监狱有一个院子,每天会随机(注意是完全随机)打开一间牢房的门,让那个囚犯到院子里来放风
3 楼 beike 2010-01-18  
不知道时间啊 老兄。
2 楼 bencode 2010-01-18  
那就在商量的时候。指定一个“计数者”

过程就从他出来的时候开始进行。这大概要多上一百天。
1 楼 dch1287 2010-01-17  
题目的描述里面很重要的一点:
囚犯没有时间的概念,不能知道自己是第几天,第几个被放出来的!

相关推荐

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

    问题的核心是,如何设计一个策略,使得100个囚犯至少每人都能至少放风一次,并且在监狱中不允许交流的情况下,如何证明每个人都至少放风了一次。 这个问题的解决方案需要使用到面向对象的思想和设计模式。首先,...

    有100名囚犯让他们依次站成一排国王命令手下先干掉全部奇数位置处的人 再次干掉全部奇数位置处的直到最后剩下一个人为止剩最后幸存者

    总结一下,这个问题是一个关于逻辑推理和信息传递的挑战。囚犯们通过理解和利用淘汰规则,以及设计一套预设的编码系统,可以提高至少一人存活的概率。尽管不能保证哪位囚犯能存活,但这种策略确保了生存的可能性。这...

    蛮力法求解百钱买百鸡的问题

    4. 如果公鸡、母鸡和小鸡的总价等于100元,且小鸡数量是3的倍数,那么找到了一个解,输出这个解并累加计数器count。 5. 如果没有找到任何解,则输出“问题无解”。 实验代码: ```cpp #include #include using ...

    藏族民间故事长虎牙的国王-2页.pdf

    他以自己的私欲为导向,对权力的滥用到了令人发指的地步,下令每天处决一个囚犯,仅仅是为了满足他对血味美食的癖好。 国王的行为,不仅在道德上是巨大的败笔,更在政治上导致了灾难性的后果。权力的滥用最终会失去...

    狱吏问题,求解钱币兑换问题,沙漠问题蛮力算法.pdf

    某国王对囚犯进行大赦,让一狱吏n次通过一-排锁着的n间. 牢房,每通过一-次按所定规则转动n间牢房中的某些门锁,每转 动一次原来锁着的被打开,原来打开的被锁上通过n次后,门锁 开着的,牢房中的犯人被放出,否则,...

    信号检测MATLAB

    在MATLAB编程环境中,我们可以利用其强大的数值计算和模拟功能来解决各种问题,包括像“国王囚犯问题”这样的逻辑算法。在这个问题中,我们有100个囚犯,根据他们的状态(解放者、出去过的人、没出去过的人)进行...

    一些关于笔试智力题很好的

    9. **五个囚犯问题**:这是一道概率和策略问题。囚犯的目标是最大化存活人数。最优策略是:囚犯4先抓1颗,囚犯5抓39颗,这样无论其他人抓多少,抓得最多的和最少的都会被处死,而其余三人都能活下来。 10. **国王与...

    假话国王子和真话国公主.docx

    在这个故事中,我们看到了两个截然不同的国度——假话国和真话国,以及这两个国家的代表人物:假话国的王子和真话国的公主茉莉。故事围绕着王子和公主之间的交流展开,揭示了真诚沟通的重要性以及言行一致的力量。 ...

    IBM逻辑题面试题

    在国王给所有人都戴上黑色帽子的情况下,其中一个囚犯通过推理得知自己的帽子颜色。问题是他是如何推理出这个结论的? **解决方案**: - 假设A、B、C三人被戴上帽子。 - A可以看到B和C的帽子颜色。如果B和C都戴的是...

    迅雷上机笔试

    迅雷上机笔试软件测试凭印象了:算法题:1.连接两个单向链表,返回排序后的结果。2.一个保存有10000个URL的文本文件,删除其中相同的URL。3.将9个石子放在9x9的方格中,要求...国王给三个囚犯每人戴了一顶帽子,帽子不

    2017高考英语真题分类汇编阅读理解试题专项训练.pdf

    3. **巴士底狱的历史**:巴士底狱始建于1370年,在17世纪后转变为一座主要用于关押国王认为的政敌的特殊监狱。它并非普通监狱,而是国王行使权力的象征,关押的囚犯往往不知何时才能获释。 4. **巴士底狱的意义**:...

    2014届高三英语一轮必备(典型题精析)Unit6 Design课时强化训练 北师版必修2

    - `mercy`:慈悲,展示国王对待囚犯的态度。 - `rent`:租金,指房屋出租的价格。 - `feature`:特征,湿天气是苏格兰生活的一个特征。 - `relate`:把……与……联系起来,关联因果关系的能力。 - `detail`:...

    帽子的分类与发展史学习教案.pptx

    2. **17世纪的帽子**:这一时期的帽子开始具有明显的阶级标识,如公民的暗色帽子、破产者的黄色帽子、囚犯的纸帽子以及国王的金皇冠等,反映出当时社会的等级制度。 3. **18世纪的帽子**:皇室成员对高帽和复杂的...

    vc++链表游戏_聪明的囚徒

    内容索引:VC/C++源码,游戏编程,链表,... 有一国王要处置犯人,他想出了一个新方法,他让犯人围成一圈,国王规定一个数,犯人从头报到这一个数的时候都要被砍头,有一个聪明的囚徒,它躲过了一劫,你知道是怎么回事吗?

    高三英语虚拟语气讲解PPT课件.pptx

    - The king ordered that the prisoners (should) be killed the next day.(国王命令囚犯第二天被执行死刑。) - They requested that we (should) send them to work there.(他们要求我们派他们去那里工作。) ...

    2015年高中英语 Unit 3 Section 1 Warming up; Pre reading, Reading & Co

    - `convenient`(方便的):安排一个方便的时间和地点开会。 - `abrupt`(突然的):他突然改变主意让我们惊讶。 - `merry`(快乐的):他们过上了愉快的圣诞节。 - `criterion`(标准):用于判断好酒的标准是...

Global site tag (gtag.js) - Google Analytics