百囚犯问题的拓展思考

2023-11-03 04:40
文章标签 问题 思考 拓展 囚犯

本文主要是介绍百囚犯问题的拓展思考,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前两天在B站刷视频,刷到了百囚犯问题的视频详解,该问题由丹麦计算机科学家Peter Bro Miltersen于2003年首次提出,是经典的概率论和组合数学问题。在理解这题的思路之余,我又产生了一些新的思考。

目录

  • 问题描述
  • 最佳策略
  • 进一步思考
      • 策略1. 全部做同样的选择
      • 策略2. 均分成两个团队,分别做同样的选择
      • 策略3. 利用差值特性的策略
  • 数值验证
  • 总结

问题描述

在监狱中有100名囚犯,编号为1-100号。典狱长决定给囚犯们一次特赦的机会,条件是通过一项挑战。在一个房间中放着一个有100个抽屉的橱柜,里面随机放着与囚犯编号对应的1-100的号码牌。挑战开始后,每个囚犯依次进入该房间,打开不超过半数的抽屉,并从中找到与自己对应的号码则为成功,每名囚犯出去时该橱柜恢复原样。从第一名囚犯进入直至最后一名囚犯出来期间不允许有任何交流,任何一名囚犯挑战失败都会导致所有囚犯挑战失败,只有全部成功才能够特赦该100名囚犯。如果囚犯们都随机打开50个抽屉,他们的特赦几率微乎其微。所以囚犯们需要在开始之前讨论出一个最佳策略,来提高整体特赦的概率。

我们知道,如果每个囚犯都完全随机选择的话,则特赦概率为 0.5^100 ≈ 8*10^-31,但问题的提出者给出,存在一种简单可执行的方案,能将特赦概率提升到 0.3(30%)以上,没看过这个问题的不妨思考一下。
百囚犯问题

最佳策略

问题的提出者一开始也没想到更好的策略,在同事的提醒之下,他想到了利用环来解决这个问题。如果你之前接触过算法,简单来说,就是把100个抽屉和其中的纸条,看成一个有向有环图,此题即可抽象为有向有环图中不存在大于 100÷2=50 长度环的概率,计算得知约为 0.311828。

有大量的解释举证珠玉在前,本文不准备展开介绍具体策略和证明过程,有兴趣的朋友可以参考下面的文章:

https://www.bilibili.com/video/BV1kt4y1t75F b站视频

https://zhuanlan.zhihu.com/p/31211827 知乎专栏

https://blog.csdn.net/qq_36721220/article/details/105580441 CSDN 解释及代码模拟

进一步思考

即使是上述的最佳策略,对于单个囚犯而言,成功的概率依然是 0.5,并没有因为策略而提高,策略只是极大幅度提高了整体的成功概率。更进一步来说,策略将一百个独立随机事件转变成了互相影响的非独立随机事件。

对于这个问题还有哪些可执行的策略呢?他们分别是如何影响最终整体的成功概率的?为了这个问题我彻夜难免,想出来如下几点。

策略1. 全部做同样的选择

如果从一开始决定,每个人都选择同样的50个抽屉,例如编号1到50号,则最后整体成功的概率显然为 0,但对于单个人而言,成功的概率依然为 0.5。

策略1

策略2. 均分成两个团队,分别做同样的选择

如果从一开始决定,将100人均分成两个团队各50人,其中一个团队每个人都选择同样的50个抽屉,例如编号1到50号,另外一个团队每个人都选择剩下来的同样50个抽屉,例如编号51到100号,那最后整体成功的概率是多少呢?显然它是大于0的。

策略2
我们计算一下,先算100个号码牌放入100个抽屉的可能性总数。打开第一个抽屉,我们手中还剩100个号码牌,选一个放入,有100个可能性;打开第二个抽屉,我们手中还剩99个号码牌,选一个放入,有99个可能性……以此类推,最后一个抽屉,我们手中只剩最后一个号码牌,没得选,有1个可能性,所以可能性总数为100×99×98×……×1=100!

那,50人的团队都成功的可能性总数是多少呢?我们看第一个团队,编号1到50号(这里的编号是一一对应的,所以51到100号的可能性完全相同),他们都选择打开1到50号抽屉。也就是说,想要成功,1到50号抽屉里,必须恰好放着1到50号的号码牌,顺序可以完全打乱。1号抽屉可以放1到50号,即50个可能性;2号抽屉可以放1到50号,但由于1号已经放入一个号码牌了,所以只有49个可能性……以此类推,所以只看前50个抽屉都成功的可能性为50×49×48×……×1=50! 。如果第一个团队都成功了,那第二个团队一定能都成功(因为第一个团队在前50个格子已经把号码牌“消耗”掉了)。剩余从51号抽屉到100号抽屉,同理也是 50! 的可能性,所有人都成功的可能性总数为 50!×50! 。

最后成功率为 50!×50!÷100!,结果约为 9.91E-30,大概是纯随机成功的12倍,但对于单个人而言,成功的概率依然为 0.5。值得一提的是,虽然阶乘的增长倍率大于次方增长倍率,但这个式子在算到8000人后,还是大于纯随机,倍率一直在100倍之内浮动。随之产生一个猜想,这个策略的成功率恒大于随机策略吗?

即求证如下数学式子:

x ! × x ! ( 2 x ) ! > 1 2 2 x ( x ≥ 1 ) \frac{x!×x!}{(2x)!} > \frac{1}{2^{2x}} (x \geq 1) (2x)!x!×x!>22x1(x1)

数学归纳法证明如下:

  1. 验证等于1时式子成立: 1 ! × 1 ! ( 2 ) ! = 1 2 > 1 2 2 = 1 4 \frac{1!×1!}{(2)!} = \frac{1}{2} > \frac{1}{2^{2}} = \frac{1}{4} (2)!1!×1!=21>221=41
  2. 假设 x = n x=n x=n 时成立,即 n ! × n ! ( 2 n ) ! > 1 2 2 n ( n ≥ 1 ) \frac{n!×n!}{(2n)!} > \frac{1}{2^{2n}} (n \geq 1) (2n)!n!×n!>22n1(n1)
  3. 求证 ( n + 1 ) ! × ( n + 1 ) ! ( 2 n + 2 ) ! > 1 2 2 n + 2 ( n ≥ 1 ) \frac{(n+1)!×(n+1)!}{(2n+2)!} > \frac{1}{2^{2n+2}} (n \geq 1) (2n+2)!(n+1)!×(n+1)!>22n+21(n1)
  4. 化简
    ( n + 1 ) ! × ( n + 1 ) ! ( 2 n + 2 ) ! = n ! × n ! × ( n + 1 ) × ( n + 1 ) ( 2 n ) ! × ( 2 n + 2 ) × ( 2 n + 1 ) = n ! × n ! ( 2 n ) ! × n + 1 2 n + 2 × n + 1 2 n + 1 \frac{(n+1)!×(n+1)!}{(2n+2)!} = \frac{n!×n!×(n+1)×(n+1)}{(2n)!×(2n+2)×(2n+1)} = \frac{n!×n!}{(2n)!}×\frac{n+1}{2n+2}×\frac{n+1}{2n+1} (2n+2)!(n+1)!×(n+1)!=(2n)!×(2n+2)×(2n+1)n!×n!×(n+1)×(n+1)=(2n)!n!×n!×2n+2n+1×2n+1n+1

根据2假设中的大于关系

n ! × n ! ( 2 n ) ! × n + 1 2 n + 2 × n + 1 2 n + 1 > 1 2 2 n × n + 1 2 n + 2 × n + 1 2 n + 1 = 1 2 2 n × 1 2 × n + 1 2 n + 1 \frac{n!×n!}{(2n)!}×\frac{n+1}{2n+2}×\frac{n+1}{2n+1} > \frac{1}{2^{2n}}×\frac{n+1}{2n+2}×\frac{n+1}{2n+1} = \frac{1}{2^{2n}}×\frac{1}{2}×\frac{n+1}{2n+1} (2n)!n!×n!×2n+2n+1×2n+1n+1>22n1×2n+2n+1×2n+1n+1=22n1×21×2n+1n+1

1 2 2 n × 1 2 × n + 1 2 n + 1 > 1 2 2 n × 1 2 × n + 1 2 n + 2 = 1 2 2 n × 1 2 × 1 2 = 1 2 2 n + 2 \frac{1}{2^{2n}}×\frac{1}{2}×\frac{n+1}{2n+1} > \frac{1}{2^{2n}}×\frac{1}{2}×\frac{n+1}{2n+2} = \frac{1}{2^{2n}}×\frac{1}{2}×\frac{1}{2} = \frac{1}{2^{2n+2}} 22n1×21×2n+1n+1>22n1×21×2n+2n+1=22n1×21×21=22n+21

得证。

再进一步,我们继续求 f ( x ) = x ! × x ! ( 2 x ) ! ( x ≥ 1 ) f(x) = \frac{x!×x!}{(2x)!} (x \geq 1) f(x)=(2x)!x!×x!(x1)

根据上面的过程,有

f ( x + 1 ) = f ( x ) × 1 2 × x + 1 2 x + 1 = f ( x − 1 ) × 1 2 2 × x + 1 2 x + 1 × x 2 x − 1 = … … f(x+1)=f(x)×\frac{1}{2}×\frac{x+1}{2x+1}=f(x-1)×\frac{1}{2^2}×\frac{x+1}{2x+1}×\frac{x}{2x-1}=…… f(x+1)=f(x)×21×2x+1x+1=f(x1)×221×2x+1x+1×2x1x=

= f ( 1 ) × 1 2 x × ∏ i = 1 x i + 1 2 i + 1 = f ( 1 ) × ∏ i = 1 x i + 1 2 × ( 2 i + 1 ) = 1 2 × ∏ i = 1 x i + 1 4 i + 2 = ∏ i = 0 x i + 1 4 i + 2 =f(1)×\frac{1}{2^{x}}×\prod_{i=1}^{x}\frac{i+1}{2i+1}=f(1)×\prod_{i=1}^{x}\frac{i+1}{2×(2i+1)}=\frac{1}{2}×\prod_{i=1}^{x}\frac{i+1}{4i+2}=\prod_{i=0}^{x}\frac{i+1}{4i+2} =f(1)×2x1×i=1x2i+1i+1=f(1)×i=1x2×(2i+1)i+1=21×i=1x4i+2i+1=i=0x4i+2i+1

① x ! × x ! ( 2 x ) ! = ∏ i = 1 x i 4 i − 2 ( x ≥ 1 ) ① \frac{x!×x!}{(2x)!} = \prod_{i=1}^{x}\frac{i}{4i-2} (x \geq 1) (2x)!x!×x!=i=1x4i2i(x1)

又有阶乘展开

② x ! × x ! ( 2 x ) ! = ∏ i = 1 x i × i i × ( x + i ) = ∏ i = 1 x i x + i ( x ≥ 1 ) ② \frac{x!×x!}{(2x)!} = \prod_{i=1}^{x}\frac{i×i}{i×(x+i)} = \prod_{i=1}^{x}\frac{i}{x+i}(x \geq 1) (2x)!x!×x!=i=1xi×(x+i)i×i=i=1xx+ii(x1)

①②联立得

∏ i = 1 x 4 i − 2 = ∏ i = 1 x x + i ( x ≥ 1 ) \prod_{i=1}^{x}4i-2=\prod_{i=1}^{x}x+i(x \geq 1) i=1x4i2=i=1xx+i(x1)

得出了一个很不可思议的式子,且这个式子是能验证为正确的:

2 = 2
2 × 6 = 3 × 4
2 × 6 × 10 = 4 × 5 × 6
2 × 6 × 10 × 14 = 5 × 6 × 7 × 8

数学太美了!!!

策略3. 利用差值特性的策略

我们知道,抽屉是100个,编号1到100号,号码牌编号也是1到100号,显然如果分别求和,是相等的,如果把抽屉的编号减去抽屉里号码牌的编号(下简称差值),把这一百个差值相加的和,即是抽屉的和减去号码牌的和,结果一定为0。再根据概率分布,存在差值99的概率是最小的,-99同理,但存在差值为0的概率却很高,我们可以利用这一点做文章。

给定策略,k号囚犯先去找第k号抽屉,拿到的号码牌编号为m号,再去找 n=k+(k-m) 号抽屉,如果抽屉不存在(大于100或小于1),则取余数,如果抽屉已被翻开,则打开最相邻的抽屉。n号抽屉里号码牌编号为o,再下一个抽屉为 p=k+(n-o)。重复以上步骤直至找到号码牌k,或是翻完50个抽屉宣布失败。这个策略更复杂,执行起来也更麻烦。

策略3

从分布规律的角度来说,整体成功的概率是要大于纯随机的,但对于单个人而言,成功的概率依然为 0.5。我没能想到严密的证明过程,更给不出概率表达式进行计算,希望有想到的朋友能提出。

数值验证

我们可以通过程序模拟这个场景进行数值验证,由于算力关系,我只模拟到最多12人的情况。

纯随机最佳策略补充策略1补充策略2补充策略3
20.2500000.50000000.5000000.500000
40.0625000.41666700.1666670.041667
60.0156250.38333300.0500000.027778
80.0039060.36547600.0142860.005531
100.0009770.35436500.0039680.001523
120.0002440.34678900.0010820.000343
1007.88861E-310.31182809.91165E-30未知

总结

我们通过思考多种方法,更深刻的理解了百囚犯问题中独立概率与非独立概率,意外之喜是发现了一个有趣的等式:

∏ i = 1 x 4 i − 2 = ∏ i = 1 x x + i ( x ≥ 1 ) \prod_{i=1}^{x}4i-2=\prod_{i=1}^{x}x+i(x \geq 1) i=1x4i2=i=1xx+i(x1)

由2开始公差为4的等差数列的n项乘积,等于由n+1开始的连续n个自然数的乘积。

这篇关于百囚犯问题的拓展思考的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/335649

相关文章

好题——hdu2522(小数问题:求1/n的第一个循环节)

好喜欢这题,第一次做小数问题,一开始真心没思路,然后参考了网上的一些资料。 知识点***********************************无限不循环小数即无理数,不能写作两整数之比*****************************(一开始没想到,小学没学好) 此题1/n肯定是一个有限循环小数,了解这些后就能做此题了。 按照除法的机制,用一个函数表示出来就可以了,代码如下

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

购买磨轮平衡机时应该注意什么问题和技巧

在购买磨轮平衡机时,您应该注意以下几个关键点: 平衡精度 平衡精度是衡量平衡机性能的核心指标,直接影响到不平衡量的检测与校准的准确性,从而决定磨轮的振动和噪声水平。高精度的平衡机能显著减少振动和噪声,提高磨削加工的精度。 转速范围 宽广的转速范围意味着平衡机能够处理更多种类的磨轮,适应不同的工作条件和规格要求。 振动监测能力 振动监测能力是评估平衡机性能的重要因素。通过传感器实时监

缓存雪崩问题

缓存雪崩是缓存中大量key失效后当高并发到来时导致大量请求到数据库,瞬间耗尽数据库资源,导致数据库无法使用。 解决方案: 1、使用锁进行控制 2、对同一类型信息的key设置不同的过期时间 3、缓存预热 1. 什么是缓存雪崩 缓存雪崩是指在短时间内,大量缓存数据同时失效,导致所有请求直接涌向数据库,瞬间增加数据库的负载压力,可能导致数据库性能下降甚至崩溃。这种情况往往发生在缓存中大量 k

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

【VUE】跨域问题的概念,以及解决方法。

目录 1.跨域概念 2.解决方法 2.1 配置网络请求代理 2.2 使用@CrossOrigin 注解 2.3 通过配置文件实现跨域 2.4 添加 CorsWebFilter 来解决跨域问题 1.跨域概念 跨域问题是由于浏览器实施了同源策略,该策略要求请求的域名、协议和端口必须与提供资源的服务相同。如果不相同,则需要服务器显式地允许这种跨域请求。一般在springbo

题目1254:N皇后问题

题目1254:N皇后问题 时间限制:1 秒 内存限制:128 兆 特殊判题:否 题目描述: N皇后问题,即在N*N的方格棋盘内放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在同一斜线上。因为皇后可以直走,横走和斜走如下图)。 你的任务是,对于给定的N,求出有多少种合法的放置方法。输出N皇后问题所有不同的摆放情况个数。 输入

vscode中文乱码问题,注释,终端,调试乱码一劳永逸版

忘记咋回事突然出现了乱码问题,很多方法都试了,注释乱码解决了,终端又乱码,调试窗口也乱码,最后经过本人不懈努力,终于全部解决了,现在分享给大家我的方法。 乱码的原因是各个地方用的编码格式不统一,所以把他们设成统一的utf8. 1.电脑的编码格式 开始-设置-时间和语言-语言和区域 管理语言设置-更改系统区域设置-勾选Bata版:使用utf8-确定-然后按指示重启 2.vscode