當前位置: 華文星空 > 心靈

圓桌上 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} ,這與上述論斷一致(說明我們的猜測是合理的)。