百囚犯问题的拓展思考

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

相关文章

如何解决idea的Module:‘:app‘platform‘android-32‘not found.问题

《如何解决idea的Module:‘:app‘platform‘android-32‘notfound.问题》:本文主要介绍如何解决idea的Module:‘:app‘platform‘andr... 目录idea的Module:‘:app‘pwww.chinasem.cnlatform‘android-32

kali linux 无法登录root的问题及解决方法

《kalilinux无法登录root的问题及解决方法》:本文主要介绍kalilinux无法登录root的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录kali linux 无法登录root1、问题描述1.1、本地登录root1.2、ssh远程登录root2、

SpringBoot应用中出现的Full GC问题的场景与解决

《SpringBoot应用中出现的FullGC问题的场景与解决》这篇文章主要为大家详细介绍了SpringBoot应用中出现的FullGC问题的场景与解决方法,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录Full GC的原理与触发条件原理触发条件对Spring Boot应用的影响示例代码优化建议结论F

MySQL 中查询 VARCHAR 类型 JSON 数据的问题记录

《MySQL中查询VARCHAR类型JSON数据的问题记录》在数据库设计中,有时我们会将JSON数据存储在VARCHAR或TEXT类型字段中,本文将详细介绍如何在MySQL中有效查询存储为V... 目录一、问题背景二、mysql jsON 函数2.1 常用 JSON 函数三、查询示例3.1 基本查询3.2

Pyserial设置缓冲区大小失败的问题解决

《Pyserial设置缓冲区大小失败的问题解决》本文主要介绍了Pyserial设置缓冲区大小失败的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录问题描述原因分析解决方案问题描述使用set_buffer_size()设置缓冲区大小后,buf

resultMap如何处理复杂映射问题

《resultMap如何处理复杂映射问题》:本文主要介绍resultMap如何处理复杂映射问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录resultMap复杂映射问题Ⅰ 多对一查询:学生——老师Ⅱ 一对多查询:老师——学生总结resultMap复杂映射问题

java实现延迟/超时/定时问题

《java实现延迟/超时/定时问题》:本文主要介绍java实现延迟/超时/定时问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java实现延迟/超时/定时java 每间隔5秒执行一次,一共执行5次然后结束scheduleAtFixedRate 和 schedu

如何解决mmcv无法安装或安装之后报错问题

《如何解决mmcv无法安装或安装之后报错问题》:本文主要介绍如何解决mmcv无法安装或安装之后报错问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mmcv无法安装或安装之后报错问题1.当我们运行YOwww.chinasem.cnLO时遇到2.找到下图所示这里3.

浅谈配置MMCV环境,解决报错,版本不匹配问题

《浅谈配置MMCV环境,解决报错,版本不匹配问题》:本文主要介绍浅谈配置MMCV环境,解决报错,版本不匹配问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录配置MMCV环境,解决报错,版本不匹配错误示例正确示例总结配置MMCV环境,解决报错,版本不匹配在col

Vue3使用router,params传参为空问题

《Vue3使用router,params传参为空问题》:本文主要介绍Vue3使用router,params传参为空问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录vue3使用China编程router,params传参为空1.使用query方式传参2.使用 Histo