三门问题

什么是三门问题

三门问题(Monty Hall problem)亦称为蒙提霍尔问题、蒙特霍问题或蒙提霍尔悖论,大致出自美国的电视游戏节目Let’s Make a Deal。问题名字来自该节目的主持人蒙提·霍尔(Monty Hall)。参赛者会看见三扇关闭了的门,其中一扇的后面有一辆汽车,选中后面有车的那扇门可赢得该汽车,另外两扇门后面则各藏有一只山羊。当参赛者选定了一扇门,但未去开启它的时候,节目主持人开启剩下两扇门的其中一扇,露出其中一只山羊。主持人其后会问参赛者要不要换另一扇仍然关上的门。问题是:换另一扇门是否会增加参赛者赢得汽车的机率。如果严格按照上述的条件,那么答案是会。不换门的话,赢得汽车的几率是1/3。换门的话,赢得汽车的几率是2/3。

程序验证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
int bingo = 0;
int total = 1000000;
// 改变选择
for(int a=0;a<total;a++){
LinkedList door = new LinkedList();
Random random = new Random();
int key = random.nextInt(3);
for(int i = 0; i<3; i++){
if(i == key){
door.add("car");
}else {
door.add("sheep");
}
}

int choose = random.nextInt(3);
door.remove(choose);
door.add(choose,"choose");
int open;
while (true){
open = random.nextInt(3);
if(open != choose && !door.get(open).equals("car")){
break;
}
}

int finalChoose;
while (true){
finalChoose = random.nextInt(3);
if(finalChoose != choose && finalChoose != open){
break;
}
}
if (door.get(finalChoose).equals("car")){
bingo++;
}
}
System.out.println("改变策略 P = " + bingo + "/" + total);
System.out.println("改变策略 P = " + (bingo*1.0 / total));

// 不改变选择
bingo = 0;
for(int a=0;a<total;a++){
LinkedList door = new LinkedList();
Random random = new Random();
int key = random.nextInt(3);
for(int i = 0; i<3; i++){
if(i == key){
door.add("car");
}else {
door.add("sheep");
}
}
int choose = random.nextInt(3);
if (door.get(choose).equals("car")){
bingo++;
}
}
System.out.println("不改变策略 P = " + bingo + "/" + total);
System.out.println("不改变策略 P = " + (bingo*1.0 / total));

运行结果:

1
2
3
4
改变策略 P = 666635/1000000
改变策略 P = 0.666635
不改变策略 P = 334133/1000000
不改变策略 P = 0.334133

可见,换门的话,能拿奖的概率会高一点。

作者

VGEAREN

发布于

2021-12-15

更新于

2022-01-27

许可协议

评论