谢邀,这是非常典型的 约瑟夫问题 (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]
有一个猜测角度是,2 号玩家的幸存率应该 约等于 1 号玩家的 5/6。理由如下:
在我们的 1000 万次模拟中,2 号玩家幸存次数与 1 号玩家幸存次数之比是 \dfrac{94789}{113630} \approx 0.83\approx \dfrac{5}{6} ,这也符合预期。
根据 @皮皮虾-9527 的解析结果,2 号玩家幸存概率与 1 号玩家幸存概率之比是 0.83452\cdots\approx \dfrac{5}{6} ,这与上述论断一致(说明我们的猜测是合理的)。