三门问题模拟与概率验证

学习笔记作者:admin日期:2025-07-03点击:10

摘要:通过Python代码模拟三门问题,验证换门策略的胜率。在大量随机实验中,发现换门成功率约为2/3(约66.7%),符合理论分析。

三门问题简述

      三门问题(Monty Hall Problem)是一个经典的概率谜题,源于美国电视节目《Let's Make a Deal》。问题描述如下:你面对三扇门,其中一扇门后是汽车,另外两扇门后是山羊。你选择一扇门后,主持人会打开另一扇有山羊的门,并询问你是否换门。直觉上认为换不换概率一样,但实际换门的概率更高。

验证目标

      通过编写Python程序,使用大量随机数据验证以下内容:

  • 设定验证次数
  • 提前设置本次准确答案,并输出
  • 每次都换门,验证成功与否
  • 汇总成功率

实现步骤

      1. 设置三个门,其中一扇门后是车(用0、1、2表示);
2. 选手随机选一扇门;
3. 主持人打开一扇有山羊的门(不是选手选的,也不是藏车的);
4. 选手换门(换成未被自己选、也未被主持人打开的那扇门);
5. 判断换门后是否赢了;
6. 汇总成功率。

Python代码实现


import random

def monty_hall_simulation(trials):
    win_count = 0
    for _ in range(trials):
        # 步骤1:设置三个门,其中一扇门后是车(用0、1、2表示三扇门)
        doors = [0, 1, 2]
        car_door = random.choice(doors)  # 随机放置汽车

        # 步骤2:选手随机选一扇门
        player_choice = random.choice(doors)

        # 步骤3:主持人打开一扇有山羊的门(不是选手选的,也不是藏车的)
        remaining_doors = [d for d in doors if d != player_choice and d != car_door]
        if len(remaining_doors) == 1:
            host_open = remaining_doors[0]
        else:
            # 如果选手一开始选中了车,主持人可以任选一扇山羊门
            host_open = random.choice([d for d in doors if d != player_choice])

        # 步骤4:选手换门(换成未被自己选、也未被主持人打开的那扇门)
        switch_door = [d for d in doors if d != player_choice and d != host_open][0]

        # 步骤5:判断换门后是否赢了
        if switch_door == car_door:
            win_count += 1

    # 计算成功率
    win_rate = win_count / trials
    return win_rate

# 设定验证次数
trials = 100000
win_rate = monty_hall_simulation(trials)
print(f"总共模拟 {trials} 次,换门策略下成功率为: {win_rate:.4f} 或 {win_rate * 100:.2f}%")

运行结果

      示例输出(每次运行略有不同,但接近理论值):


总共模拟 100000 次,换门策略下成功率为: 0.6668 或 66.68%

结论

      通过大量随机实验验证,换门策略的成功率约为2/3(约66.7%),这与理论分析一致。因此,在三门问题中,**换门更优**。

上一篇