1. 程式人生 > 其它 >python遊戲房間_還在糾結三門問題?不如用程式碼暴力驗證(附Python程式碼)

python遊戲房間_還在糾結三門問題?不如用程式碼暴力驗證(附Python程式碼)

技術標籤:python遊戲房間

c7c440a7c6d06ee4b30b557130a5abd9.png

三門問題是一個經常在各大論壇裡出現的問題。對於大眾來說,三門問題可以說是最具有富有爭議性的數學問題之一。三門問題具體表述如下:

有一個電視遊戲競猜節目,主持向挑戰者(也就是你)展示了三扇門。有一扇門之後是一輛小轎車,另兩扇門之後是空房間。主持人事先知道門後是什麼。

遊戲分為三步:首先,你選擇一扇門;然後,主持人將會開啟剩餘的兩扇門中的一扇,展示一個空的房間(當然他從未開啟那扇後面藏有轎車的門);最後,你可以選擇是仍然選擇你開始選擇的那扇門,還是選擇去開啟另一扇仍然關閉的門。 如果你選擇換門,則你獲得小轎車的概率是多少?

咋一看,貌似這道題的答案是二分之一。因為不管你選擇哪扇門,主持人都會一邊向你壞笑一邊開啟一扇空門,主持人開啟空門這個動作看起來是多餘的。

但是答案是:選擇換門是更好的策略。理論證明可以見我的這篇文章:

武辰:[終結數學月經題系列2]三門問題​zhuanlan.zhihu.com

如果你不想看理論證明,或者不認同我的答案,或者看完理論解釋後仍然雲裡霧裡,怎麼辦?親自用程式模擬一遍或許對你有幫助。

在下文,我給出了我的程式設計模擬的過程。我的程式碼是用Python寫的,關鍵的地方都加了註釋。

8d5dbc05a5331b1bb7349694b9b83abb.png
import random
buhuan=0 #不換
huan=0 #換

for i in range(10000): #這意味著我們要做1000次實驗
    car = random.choice([1,2,3]) #汽車隨機出現在三扇門之中
    challenger = random.choice([1,2,3]) #挑戰者隨機選擇了一扇門
    #以下五行程式碼:主持人隨機選擇一扇門,這扇門不是挑戰者選擇的門,也不是汽車所在的門
    host_list = [1,2,3]
    host_list.remove(challenger)
    if car in host_list:
        host_list.remove(car)
    host = random.choice(host_list)
    
    if challenger == car:
        buhuan = buhuan+1 #如果挑戰者一開始選的門背後有汽車,那麼不換是對的
    else:
        huan = huan+1 #如果挑戰者一開始選的門背後沒有汽車,那麼換是對的
    
print(buhuan)
print(huan)

程式碼執行的結果是:換門相比於不換門,獲獎的次數多了一倍!


開個腦洞,把題目稍微做變動:主持人事先不知道車在哪個門後面。如果主持人在第二步開啟的門剛好是有汽車的門,那麼遊戲重來。在這種情況下,換門與不換門孰優孰劣?

import random
buhuan=0
huan=0

for i in range(1000):#這意味著我們要做1000次實驗
    car = random.choice([1,2,3])#汽車隨機出現在三扇門之中
    challenger = random.choice([1,2,3])#挑戰者隨機選擇了一扇門
    #以下三行程式碼:主持人隨機選擇一扇門,這扇門不是挑戰者選擇的門
    host_list = [1,2,3]
    host_list.remove(challenger)
    host = random.choice(host_list)
    
    if host == car:
        continue #如果主持人在第二步選的門是汽車,則重來

    if challenger == car:
        buhuan = buhuan+1
    else:
        huan = huan+1

print(buhuan)
print(huan)

程式碼執行的結果是:換門與不換門的效果是一樣的。


那麼問題又來了,假如我不知道主持人事先是否知道車在哪扇門後面,那麼挑戰者應該換門嗎?

這個問題只能定性分析,而無法定量分析。答案當然是應該換門。因為不論主持人事先是否知道車在哪扇門後面,換門都至少不比不換門差。但是我不知道換門後獲得汽車的具體概率,而且我認為沒有人能夠求出這個概率,如果大家都是忠實的頻率學派的擁護者的話。事實上並不是所有的事情都是有概率可言的。所以如果要精確求概率的話,這個問題就變得無意義了。

如果有機會的話,我會陸續更新其他具有爭議性的數學問題的程式碼實現。程式設計對於解決數學問題,尤其是概率論方面的問題,真是如虎添翼。程式模擬雖然不能嚴格證明一個數學結論,但是可以啟發思維,指引著思路往正確的方向走。當然它還有個小的好處,就是可以迅速結束論壇裡或者各種群裡關於三門問題的無休止的爭論……