最近看了一個很有趣的問題:三門問題
問題簡述:
一個抽獎遊戲。從三扇門(其中有兩扇門後羊,一扇門後是車)中選中門後有汽車的門。
參賽者一開始從3個門裏面選一個門(先不打開門)
然後主持人(主持人知曉門後的情況)把另一個門後是羊的門打開
最後只剩兩扇未知的門,問你要不要把原來的選擇換成另一扇門。
答案:
要換,換了之後,選中車的概率是2/3,選中羊的概率是1/3。
這個問題一開始看了好多解說都覺得好難理解,直到我看了李永樂老師的科普視頻之後,恍然大悟!李老師的b站視頻
疑惑:
大多數人會覺得,最後只剩2扇門(其中一扇是你一開始選的),二選一,應該是1/2的概率纔對,但是注意了。。你一開始選的門是在原來的3扇門中選的,而不是在後面的兩扇門中選的,所以這扇門是車的概率是1/3,不是1/2。主持人的操作不影響它的概率。
解答:
-
我們先看不換的情況:
因爲不換門,後面主持人怎麼操作,對概率沒有影響。就是三選一。
所以:車的概率:1/3, 羊的概率:2/3 -
換的情況:
這裏注意,主持人把其中一扇羊門打開,所以只剩下一扇車門和一扇羊門。換門就等於改變結果。
一開始選的如果是車的門,換了另一扇門肯定是羊的門;同理,一開始選的如果是羊的門,換了就是車。
那我問你
一開始選中車的概率是多少?1/3。
一開始選中羊的概率多少?2/3。
你說換不換?肯定換啊!因爲一開始選的很可能不是車,有2/3的概率是羊,最後換個門就反轉了,有2/3的概率是中車。
所以:車的概率:2/3, 羊的概率:1/3
圖:
看圖也看的出來,一開始選的羊的,換門後都變成車了
總結:
不換門:中車的概率:1/3, 中羊的概率:2/3
換門:中車的概率:2/3, 中羊的概率:1/3
其實並不是條件概率,只是反轉而已。主持人把一扇羊門打開後,換門就會反轉結果。
舉一反三:
如果有100扇門,只有一扇門後是車,規則也一樣,主持人在你選了一扇門後,把另外的羊門打開,只剩兩扇門,這時候怎麼考慮呢?
只剩最後兩扇門的時候,和三門問題一樣,換門是會反轉結果的,所以換門是最好選擇,因爲你一開始有99/100的概率選中的是羊。換了之後會反轉,羊換車,變成99/100的概率選中車。
不換門:中車的概率:1/100, 中羊的概率:99/100
換門:中車的概率:99/100, 中羊的概率:1/100
題外話:
主持人那麼好都幫你把其他無關選項都排除了。肯定要換啊。。你一開始選的門中車概率比較低,很不靠譜的。
python程序模擬:
import random
class MontyHallGame:
def __init__(self, door_cnt=3):
self.door_cnt = door_cnt # door_cnt >= 3
self.door_arr = [False] * door_cnt # False: Goat, True: Car
self.door_arr[random.randint(0, door_cnt - 1)] = True
def play(self, select_idx, exchange):
if exchange:
# 不管幾道門,最後都會只剩下兩道門給你選擇,互爲對立面,一門有車,一門有羊
# 選了車的,換門後就是羊;同理選了羊的,換門後就是車
# 所以只要反轉一下結果就行,不用再模擬主持人的開門操作了
return not self.door_arr[select_idx]
else:
return self.door_arr[select_idx]
if __name__ == '__main__':
game_times = 100000
# test1
door_cnt = 3
print('{}道門,換與不換各自都玩{}盤遊戲'.format(door_cnt, game_times))
# 不換門
car_cnt = 0
for i in range(game_times):
game = MontyHallGame()
select_door = random.randint(0, game.door_cnt - 1)
result = game.play(select_door, False)
car_cnt += 1 if result else 0
print('不換門的情況:選中車的有{}盤,選中車的比例{}'.format(car_cnt, car_cnt / game_times))
# 換門
car_cnt = 0
for i in range(game_times):
game = MontyHallGame()
select_door = random.randint(0, game.door_cnt - 1)
result = game.play(select_door, True)
car_cnt += 1 if result else 0
print('換門的情況:選中車的有{}盤,比例{}'.format(car_cnt, car_cnt / game_times))
print()
# test2
door_cnt = 10
print('{}道門,換與不換各自都玩{}盤遊戲'.format(door_cnt, game_times))
# 不換門
car_cnt = 0
for i in range(game_times):
game = MontyHallGame(door_cnt)
select_door = random.randint(0, game.door_cnt - 1)
result = game.play(select_door, False)
car_cnt += 1 if result else 0
print('不換門的情況:選中車的有{}盤,選中車的比例{}'.format(car_cnt, car_cnt / game_times))
# 換門
car_cnt = 0
for i in range(game_times):
game = MontyHallGame(door_cnt)
select_door = random.randint(0, game.door_cnt - 1)
result = game.play(select_door, True)
car_cnt += 1 if result else 0
print('換門的情況:選中車的有{}盤,比例{}'.format(car_cnt, car_cnt / game_times))
print()
# test3
door_cnt = 100
print('{}道門,換與不換各自都玩{}盤遊戲'.format(door_cnt, game_times))
# 不換門
car_cnt = 0
for i in range(game_times):
game = MontyHallGame(door_cnt)
select_door = random.randint(0, game.door_cnt - 1)
result = game.play(select_door, False)
car_cnt += 1 if result else 0
print('不換門的情況:選中車的有{}盤,選中車的比例{}'.format(car_cnt, car_cnt / game_times))
# 換門
car_cnt = 0
for i in range(game_times):
game = MontyHallGame(door_cnt)
select_door = random.randint(0, game.door_cnt - 1)
result = game.play(select_door, True)
car_cnt += 1 if result else 0
print('換門的情況:選中車的有{}盤,比例{}'.format(car_cnt, car_cnt / game_times))
# 結果
# 3道門,換與不換各自都玩100000盤遊戲
# 不換門的情況:選中車的有33430盤,選中車的比例0.3343
# 換門的情況:選中車的有66552盤,比例0.66552
#
# 10道門,換與不換各自都玩100000盤遊戲
# 不換門的情況:選中車的有10176盤,選中車的比例0.10176
# 換門的情況:選中車的有90055盤,比例0.90055
#
# 100道門,換與不換各自都玩100000盤遊戲
# 不換門的情況:選中車的有1003盤,選中車的比例0.01003
# 換門的情況:選中車的有99019盤,比例0.99019