蒙特霍尔问题(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个没有奖的门,那显然换比不换的中奖率要高得多。总不能是你之前瞎蒙的万分之一中了吧