1. 程式人生 > 其它 >有趣智力題:蒙提霍爾悖論 —— “決定”挑戰

有趣智力題:蒙提霍爾悖論 —— “決定”挑戰

一、挑戰

你的面前有三個大門(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面試題!