三门问题 python代码模拟Monty Hall Problem

蒙特霍尔问题(Monty Hall Problem)是一个著名的概率谜题,最初由美国电视节目《让我们做个交易》(Let’s Make a Deal)中的主持人蒙特·霍尔(Monty Hall)提出。这个问题涉及到一个简单的游戏规则,但其概率性质却令人颇为困惑。

蒙特霍尔问题的描述如下:

有三扇关闭的门,其中一扇门后面有一辆汽车(奖品),另外两扇门后面是山羊(非奖品)。
参赛者首先选择一扇门,但不打开。
主持人在剩下的两扇门中打开一扇后面是山羊的门。
参赛者可以选择坚持最初的选择,也可以选择改变选择到另一扇未打开的门。
蒙特霍尔问题的关键是:是否应该改变最初的选择?直觉上,有些人可能认为改变选择并不会影响中奖的概率,因为剩下的两扇门都有相等的概率。然而,数学上的分析表明,如果参赛者选择改变最初的选择,那么中奖的概率会提高。

具体来说,如果参赛者选择坚持最初的选择,中奖的概率为 1/3;而如果参赛者选择改变选择,中奖的概率为 2/3。这个看似反直觉的结果可以通过概率论和条件概率的计算来解释。因此,蒙特霍尔问题成为了一个经典的概率谜题,引发了许多讨论和争论。

假设我们已经选了门A,主持人打开了门B。若车在A,打开B的概率是1/2,若车在C,则打开B的概率为1。B被打开可能是以车在A的前提下以1/2概率随机选择的(情况1),也可能是以车在C为前提以1的概率打开的(情况2)。虽然我不知道究竟是哪种情况,但是情况2使B被打开的可能性更大,所以以B被打开作为已知信息,可以推出已发生情况2的概率更大。


在这里插入图片描述

接下来用python代码模拟计算一下:

import random
import matplotlib.pyplot as plt
import numpy as np
# 模拟10000次蒙提霍尔问题
trials = 1000
stay_wins = 0
switch_wins = 0
stay_probs = []
switch_probs = []

for _ in range(1,trials+1):
    # 随机选择一扇门放奖品
    prize_door = random.randint(0, 2)
    #print('prize_door:',prize_door)
    # 客户随机选择一扇门
    chosen_door = random.randint(0, 2)
    
    # 主持人打开另外一扇没有奖品的门
    choice_list=[door for door in [0,1,2] if door != chosen_door and door != prize_door]
    #print("choice_list",choice_list,'  ',range(3),end='')
    opened_door = random.choice(choice_list)
    #print('opened_door:',opened_door)
    # 客户坚持原来的选择
    if chosen_door == prize_door:
        stay_wins += 1
        
    # 客户改选剩下的那扇未打开的门
    switch_door = [door for door in range(3) if door != chosen_door and door != opened_door][0]
    if switch_door == prize_door:
        switch_wins += 1
    if _>=10:#_==10 or _==100 or _==1000 or _==10000:
        # 计算坚持原来选择和改选的概率
        stay_prob = stay_wins / _
        print("stay_prob:",stay_prob)
        switch_prob = switch_wins / _
        print("switch_prob:",switch_prob)
        stay_probs.append(stay_prob)
        switch_probs.append(switch_prob)
# 绘制折线图
plt.plot(range(10, trials + 1), stay_probs, label='stay your choice')
plt.plot(range(10, trials + 1), switch_probs, label='switch to the left')

# 定义x的范围
x = np.linspace(0, trials, 100)  # 从0到10生成100个点

# 定义y=1/3和y=2/3的直线函数
y1 = np.full_like(x, 1/3)  # 创建一个与x相同大小的数组,填充为1/3
y2 = np.full_like(x, 2/3)  # 创建一个与x相同大小的数组,填充为2/3

# 绘制直线
plt.plot(x, y1, label='y = 1/3', color='blue', alpha=0.3)
plt.plot(x, y2, label='y = 2/3', color='green', alpha=0.3)

plt.xticks(np.arange(0, trials, 50))  # 设置x轴刻度从0到10,间隔为1
plt.yticks(np.arange(0, 1, 0.1))  # 设置x轴刻度从0到10,间隔为1
plt.xlabel('times')
plt.ylabel('prob')
plt.title('Monty_Hall_problem')
plt.legend()
plt.show()


在这里插入图片描述
可见,随着实验次数的增加,不改变选择和改变选择赢得车辆的概率逐步收敛与1/3和2/3,与理论计算一致。

三门因为数值上太小不容易有直观感觉,建议直接上万门问题

如果我们知道主持人一定会开掉9998个没有奖的门,那显然换比不换的中奖率要高得多。总不能是你之前瞎蒙的万分之一中了吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值