有趣智力題:蒙提霍爾悖論 —— “決定”挑戰
阿新 • • 發佈:2022-03-04
一、挑戰
你的面前有三個大門(A/B/C),其中有一個門背後有5000萬的大獎,猜對了就歸你!在你做出選擇之後(假設選擇A),會從剩下的兩個門中開啟一個沒有大獎的門(例如:B),然後問你是否改變最初的選擇?
—— “堅持你的選擇!堅持你的選擇!”
—— 不會就蒙C!
—— 《恐怖遊輪》不斷重複迴圈
二、分析
換與不換,這是一個問題?
初步一分析,這TM不就是一個盲選的問題嘛,何來最優選擇?
先說結論:一定要改變選擇!!!
說白了,不改變選擇,中獎概率只有1/3,一旦改變了選擇,中獎概率就會上升到2/3了。
換個思路分析一下,總體邏輯其實是一樣的。
假設你現在面前有1000扇門, 只有一扇門背後藏著獎品, 你第一次隨便選一個門, 然後主持人會幫你在你沒選擇的999扇門中開啟998扇沒有獎品的門, 現在場上還剩你最初選擇的那個門, 和主持人幫你排除之後的一個門, 你換不換?
三、模擬實操
1.定義大獎
import numpy as np
import pandas as pd
# 預設100輪
def get_random(num=100):
# 大獎在1/2/3號門隨機出現
lst = np.random.randint(1,4,size=num)
return lst
2.堅持最初的選擇
盲猜,不改變選擇,猜什麼最終是什麼。
# 堅持最初的選擇 def guess_one(num=100): # 正確答案 lst = get_random(num) guess = np.random.randint(1,4,size=len(lst)) judge = (lst == guess) correct_rate = judge.sum() / len(judge) print(f'本次玩了{num}輪,不改變的中獎概率為:{str(round(correct_rate * 100, 4)) + "%"}') return None guess_one(10000) # 本次玩了10000輪,不改變的中獎概率為:33.62%
3.改變最初的選擇
先隨機選擇一個,再開啟空門之後,改變選擇。
# 正確答案
lst = get_random(num=100)
# 隨機猜
guess = np.random.randint(1,4,size=len(lst))
# 改變後的最終選擇
guess_change = []
- 場景一:第1次沒猜中
# 場景一:第1次沒猜中 guess_change = [] # 改變選擇後肯定是正確答案 for ans, gue in zip(lst, guess): # print(ans, gue) if ans != gue: guess_change.append(ans)
- 場景二:第1次猜中了!
# 場景二:第1次猜中了
guess_change = []
for ans, gue in zip(lst, guess):
# print(ans, gue)
if ans == gue:
# 正確答案範圍
answer_range = [1,2,3]
# 所猜是對的 先排除
answer_range.remove(ans)
# 主持人隨機開啟1個門
answer_range.remove(answer_range[np.random.randint(0,2)])
# 剩下的即是最終選擇
guess_change.append(answer_range[0])
# len(guess_change)
- 函式封裝
def guess_two(num=100):
# 正確答案
lst = get_random(num=100)
# 隨機猜
guess = np.random.randint(1,4,size=len(lst))
# 改變後的最終選擇
guess_change = []
# 迴圈判斷
for ans, gue in zip(lst, guess):
# print(ans, gue)
if ans != gue:
# 場景一:第1次沒猜中
# 改變選擇後肯定是正確答案
guess_change.append(ans)
else:
# 場景二:第1次猜中了
# 正確答案範圍
answer_range = [1,2,3]
# 所猜是對的 先排除
answer_range.remove(ans)
# 主持人隨機開啟1個門
answer_range.remove(answer_range[np.random.randint(0,2)])
# 剩下的即是最終選擇
guess_change.append(answer_range[0])
guess_change = np.array(guess_change)
judge = (lst == guess_change)
correct_rate = judge.sum() / len(judge)
print(f'本次玩了{num}輪,改變策略的中獎概率為:{str(round(correct_rate * 100, 4)) + "%"}')
return None
guess_two(10000)
# 本次玩了10000輪,改變策略的中獎概率為:66.0%
四、對比分析
for i in (10, 100, 1000, 10000, 1000000):
guess_one(i)
'''
本次玩了10輪,不改變的中獎概率為:0.0%
本次玩了100輪,不改變的中獎概率為:37.0%
本次玩了1000輪,不改變的中獎概率為:35.2%
本次玩了10000輪,不改變的中獎概率為:33.38%
本次玩了1000000輪,不改變的中獎概率為:33.3518%
'''
for i in (10, 100, 1000, 10000, 1000000):
guess_two(i)
'''
本次玩了10輪,改變策略的中獎概率為:62.0%
本次玩了100輪,改變策略的中獎概率為:64.0%
本次玩了1000輪,改變策略的中獎概率為:71.0%
本次玩了10000輪,改變策略的中獎概率為:64.0%
本次玩了1000000輪,改變策略的中獎概率為:65.0%
'''
一目瞭然!!!
參考連結:記一道80%的人會答錯的牛X面試題!