当前位置: 华文星空 > 心灵

圆桌上 100 个人轮流开枪,最可能活下来的是几号?

2024-12-30心灵

谢邀,这是非常典型的 约瑟夫问题 (Josephus problem)的一个变体。

约瑟夫问题指的是,所有的人站成一圈等待处决,从圆圈中指定位置开始,并沿指定方向围绕圆圈进行。 在跳过指定数量的人之后,处刑下一个人。剩下的人按照此流程重复进行,问最后活下来的是谁?

具体地,如上图所示,总共 n=41 个人站成一圈等待处决,每隔 k-1=3-1=2 个人就进行处决。图中显示最后被杀死的是第 16 号和第 31 号士兵。


回到题主的问题,题主相当于是把约瑟夫问题中的 确定性处决 更改为 概率性处决 ,且指定了 相邻 的人进行概率性处决(即 1 号对 2 号开枪,2 号对 3 号开枪,……,100 号对 1 号开枪)。

对于谁是最有可能活下来的人,严格计算应该是可以的,但我目前还没找到好的解决办法。

补充一句:我看其他答主的回答似乎都是假设了每次开枪都会重置弹仓,但和(我个人理解的)题意不同。我的代码模拟的是, 开枪后不重置弹仓,直接交给下一个人进行射击,直到有人中弹后才重置弹仓

为了保护发际线,数值模拟更加解忧省事。

更新: @皮皮虾-9527 已经给出了完整解答,具体请见回答:圆桌上 100 个人轮流开枪,最可能活下来的是几号?

我们可以通过编程来模拟一下结果:

import random import matplotlib.pyplot as plt def game_simulation ( num_players = 100 , num_simulations = 1000000 ): survivor_counts = [ 0 ] * num_players for _ in range ( num_simulations ): players = list ( range ( 1 , num_players + 1 )) # players = [1, 2, ..., 100] bullet_position = random . randint ( 1 , 6 ) # 随机初始化子弹位置 current_position = 0 # 从 1 号玩家开始持枪 while len ( players ) > 1 : if bullet_position == 1 : # 当前持枪玩家的下一位玩家中弹,将其移出游戏 players . pop (( current_position + 1 ) % len ( players )) # 重置子弹位置 bullet_position = random . randint ( 1 , 6 ) # 当前持枪玩家调整为中弹玩家的下一位玩家 if current_position == len ( players ): current_position = 0 else : current_position = ( current_position + 1 ) % len ( players ) else : # 子弹未发射,轮到下一位玩家 bullet_position -= 1 current_position = ( current_position + 1 ) % len ( players ) # 记录最后幸存者 survivor_counts [ players [ 0 ] - 1 ] += 1 # 找到幸存次数最多的玩家 most_likely_survivor = survivor_counts . index ( max ( survivor_counts )) + 1 # 找到幸存次数最少的玩家 most_likely_death = survivor_counts . index ( min ( survivor_counts )) + 1 return most_likely_survivor , most_likely_death , survivor_counts most_likely_survivor , most_likely_death , survivor_counts = game_simulation () print ( f "最可能的幸存者是第 {most_likely_survivor} 号玩家。" ) print ( f "最可能的倒霉蛋是第 {most_likely_death} 号玩家。" ) print ( "每位玩家的幸存次数:" , survivor_counts )

执行 1000 万次的游戏模拟后,我们发现 最可能的幸存者是 1 号玩家 。(但并不绝对,1 号玩家的幸存次数和 90 ~ 100 号玩家的幸存次数差别不是很大)

但明显可以看出来的是, 最容易去世的是 7 号玩家。

>> 最可能的幸存者是第 1 号玩家。
>> 最可能的倒霉蛋是第 7 号玩家。
>> 每位玩家的幸存次数: [113630, 94789, 95030, 92461, 88633, 85760, 81498, 96017, 90016, 90987, 90308, 89092, 89777, 90939, 91599, 91456, 91454, 91178, 91471, 92468, 92262, 92744, 92615, 92942, 92805, 93829, 93155, 93328, 93632, 93885, 94538, 94805, 95580, 95169, 94934, 95600, 95341, 95850, 96303, 96567, 97172, 97231, 97397, 97749, 97779, 97928, 98534, 98804, 98414, 98670, 99422, 99679, 99868, 100214, 99931, 100356, 101199, 101392, 101445, 101877, 101390, 101925, 102725, 102952, 102808, 103007, 103395, 103609, 103653, 104075, 104891, 104607, 104732, 104745, 105786, 105626, 105711, 106266, 107642, 107120, 107291, 107625, 107181, 108014, 108448, 108361, 109235, 109511, 109860, 110527, 110796, 110211, 111535, 111316, 111295, 112155, 112389, 112346, 112866, 112865]
1 号是最有可能幸存的玩家(但和 90~100 号玩家幸存次数差别不大),7 号玩家最容易去世。
1000 万次模拟跑了十分钟,但我懒得进一步优化了┓( ´∀` )┏
更新:1000 万次模拟结果和 @皮皮虾-9527 得到的解析结果是相符的。

有一个猜测角度是,2 号玩家的幸存率应该 约等于 1 号玩家的 5/6。理由如下:

  • 假设 1 号玩家的幸存率为 X_1 。此时圆桌上的玩家为 1-2-3-...-100-1 的循环。
  • 当 1 号开枪,有 5/6 的概率 2 号玩家不会中弹身亡。此时左轮枪转移到 2 号玩家手上,圆桌上的玩家为 2-3-4-...-100-1-2 的循环。此时的 2 号玩家就充当了之前 1 号玩家的角色(除了之前 1 号玩家手中左轮枪子弹位置在 1~6 之间随机,此时 2 号玩家左轮枪子弹位置在 1~5 之间随机,其余情况均相同),那么此时 2 号玩家的幸存率 \tilde{X}_2 应该与先前 1 号玩家的幸存率大致相同,即 \tilde{X}_2 \approx X_1 。
  • 所以 2 号玩家幸存率应该大致是 1 号玩家幸存率的 5/6,即 X_2 = \dfrac{5}{6} \tilde{X}_2 \approx \dfrac{5}{6}X_1 。
  • 在我们的 1000 万次模拟中,2 号玩家幸存次数与 1 号玩家幸存次数之比是 \dfrac{94789}{113630} \approx 0.83\approx \dfrac{5}{6} ,这也符合预期。

    根据 @皮皮虾-9527 的解析结果,2 号玩家幸存概率与 1 号玩家幸存概率之比是 0.83452\cdots\approx \dfrac{5}{6} ,这与上述论断一致(说明我们的猜测是合理的)。