三门问题是一个著名的概率问题,源自美国电视游戏节目《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%