三门问题是一个著名的概率问题,源自美国电视游戏节目《Let’s Make a Deal》。问题描述如下:

Question

参赛者面前有三扇门,其中一扇门后有汽车,另两扇门后各有一只山羊。 参赛者选择一扇门后,主持人会打开剩下两扇门中的一扇,露出一只山羊。 然后主持人问参赛者是否要更换选择。 问题是:更换选择是否会增加赢得汽车的概率?

定性分析

等概率?

n 门问题

等价叙述

定量分析

代码模拟

import random
 
def monty_hall(switch, trials):
    wins = 0
    for _ in range(trials):
        doors = ['car', 'goat', 'goat']
        random.shuffle(doors)
 
        # 玩家初始选择
        choice = random.randint(0, 2)
 
        # 找出主持人可以打开的门(不是玩家选的门,并且是山羊)
        available_doors = [i for i in range(3) if i != choice and doors[i] == 'goat']
 
        # 主持人随机打开一个符合条件的门
        opened_door = random.choice(available_doors)
 
        # 如果玩家选择换门,选择唯一的其他门
        if switch:
            remaining_doors = [i for i in range(3) if i != choice and i != opened_door]
            choice = remaining_doors[0]
 
        # 记录获胜情况
        if doors[choice] == 'car':
            wins += 1
 
    return wins / trials
 
# 需要测试的试验次数
trial_list = [10, 100, 1000, 10000]
 
print(f"{'Trials':<10}{'不换门胜率':<15}{'换门胜率'}")
print("-" * 40)
 
for t in trial_list:
    win_rate_no_switch = monty_hall(False, t)
    win_rate_switch = monty_hall(True, t)
    print(f"{t:<10}{win_rate_no_switch:.2%}       {win_rate_switch:.2%}")

结果示例:

trials    不换门胜率          换门胜率-  
----------------------------------------  
10        10.00%       60.00%  
100       25.00%       68.00%  
1000      32.30%       66.30%  
10000     33.48%       66.29%  
100000    33.05%       66.46%