最近不知为啥(可能是因为我一直在研究概率)被头条连推送了几次三门问题的视频,说实话有些博主根本就没有把问题讲清楚~~ 作为程序员,我想还是用代码来解决最有说服力~~~

分析过程(略),上code:


import random

def monty_hall_simulation(num_trials=1000000):

    switch_wins = 0   # 换门获胜次数
    stay_wins = 0     # 不换门获胜次数

    for _ in range(num_trials):

        # 随机生成奖品位置(0, 1, 2)
        prize_door = random.randint(0, 2)

        # 参赛者初始选择
        initial_choice = random.randint(0, 2)

        # 主持人剩余可选的门(无奖品且未被选的门)
        remaining_doors = [door for door in [0, 1, 2] if door != initial_choice and door != prize_door]

        # 如果参赛者开始选对了(剩余有2个门),主持人可随机开一扇
        # 如果开始选错了(剩余只有1个门),主持人只能开这扇门
        opened_door = random.choice(remaining_doors) if len(remaining_doors) > 1 else remaining_doors[0]

        # 换门:选择既不是初始选择也不是主持人打开的门
        final_choice_switch = [door for door in [0, 1, 2] if door != initial_choice and door != opened_door][0]

        # 统计结果
        if final_choice_switch == prize_door:
            switch_wins += 1
        #endif

        if initial_choice == prize_door:
            stay_wins += 1
        #endif

    #next

    print(f"  模拟次数: {num_trials}")
    print(f"  换门胜率: {switch_wins*100 / num_trials:.2f} %")
    print(f"不换门胜率: {stay_wins*100 / num_trials:.2f} %")

#end def

# -----------------------------------------------------------------------------
# Main Program
# -----------------------------------------------------------------------------
if __name__ == '__main__':

    # 运行模拟(默认10万次)
    monty_hall_simulation()

运行结果如下:

  模拟次数: 1000000
  换门胜率: 66.62 %
不换门胜率: 33.38 %

ps: 不知道三门问题的请自行百度~

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐