- 介绍
- 游戏规则
- 理解分析
- 理解分析一
- 理解分析二
- 理解分析三
- 理解分析四
- 用编程验证
- Python
- Java
游戏规则蒙提霍尔悖论亦称为蒙提霍尔问题、蒙特霍问题或蒙提霍尔悖论、三门问题(Monty Hall problem)。是一个源自博弈论的数学游戏问题,大致出自美国的电视游戏节目Let’s Make a Deal。问题的名字来自该节目的主持人蒙提·霍尔(Monty Hall)。
- 参赛者会看见三扇关闭了的门,其中一扇的后面有一辆汽车,选中后面有车的那扇门就可以赢得该汽车,而另外两扇门后面则各藏有一只山羊。
- 当参赛者选定了一扇门,但未去开启它的时候,节目主持人会开启剩下两扇门的其中一扇,露出其中一只山羊。
- 主持人其后会问参赛者要不要换另一扇仍然关上的门。
情景 | 换 | 不换 |
---|---|---|
选中了有车的门 | 输 | 赢 |
选中了有羊(A)的门 | 赢 | 输 |
选中了有羊(B)的门 | 赢 | 输 |
理解分析二结论: 换赢的概率为2/3,不换赢的概率为1/3
理解分析三初选时你获胜的概率是1/3,如果你不换,你的概率一直都是1/3,那个剩下的就是2/3。
理解分析四可以将之理解为抽奖游戏,假设奖池有3个卡片(只有一个中奖),A抽了一个,剩下给B抽了。
这时,A中奖的概率是1/3,而B中奖的概率为2/3。B不会因为发现有一个卡片没有中奖而概率会变化。
用编程验证 Python例如一群人在玩抽奖游戏,每个人都抽奖了,但是开奖的顺序是不同的,你不会因为前面有人开奖不中自己中奖的概率就会改变,当你抽到奖的时候你的中奖概率就固定不变了,只是感官直觉上觉得变了。
import random
def play(change_door):
# 随机从【1,2, 3】中选一个做为正确答案(车)
prize_door = random.randint(1, 3)
# 模拟参赛者从【1,2, 3】中选一个
player_choice = random.randint(1, 3)
if prize_door is player_choice:
return False if change_door else True # 参赛者选择换的时候
else:
return True if change_door else False # 参赛者选择不换的时候
def three_door(N, change_door):
if N < 0:
print('请输入大于0的参数')
return
wins = 0
for i in range(0, N):
if play(change_door):
wins += 1
print("换" if change_door else "不换")
print(f"赢的概率:{wins / N}")
if __name__ == '__main__':
N = 100000
three_door(N, True) # 参赛者选择换
three_door(N, False) # 参赛者选择不换
Java
public class ThreeDoor {
private int N;
public ThreeDoor(int N) {
if (N <= 0)
throw new IllegalArgumentException("请输入大于0的参数");
this.N = N;
}
public void run(boolean changeDoor) {
int wins = 0;
for (int i = 0; i < N; i++)
if (play(changeDoor))
wins++;
System.out.println(changeDoor ? "换" : "不换");
System.out.println("赢的概率: " + (double) wins / N);
}
private boolean play(boolean changeDoor) {
// 随机从【1,2, 3】中选一个做为正确答案(车)
int prizeDoor = (int) (Math.random() * 3 + 1);
// 模拟参赛者从【1,2, 3】中选一个
int playerChoice = (int) (Math.random() * 3 + 1);
if (playerChoice == prizeDoor)
return changeDoor ? false : true; // 参赛者选择换的时候
else
return changeDoor ? true : false; // 参赛者选择不换的时候
}
public static void main(String[] args) {
int N = 1000000; // 迭代验证次数
ThreeDoor exp = new ThreeDoor(N);
exp.run(true); // 参赛者选择换
exp.run(false); // 参赛者选择不换
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)