三门问题(Monty Hall problem)亦称为蒙提霍尔问题、蒙特霍问题或蒙提霍尔悖论,大致出自美国的电视游戏节目Let's Make a Deal。问题名字来自该节目的主持人蒙提·霍尔(Monty Hall)。参赛者会看见三扇关闭了的门,其中一扇的后面有一辆汽车,选中后面有车的那扇门可赢得该汽车,另外两扇门后面则各藏有一只山羊。当参赛者选定了一扇门,但未去开启它的时候,节目主持人开启剩下两扇门的其中一扇,露出其中一只山羊。主持人其后会问参赛者要不要换另一扇仍然关上的门。问题是:换另一扇门是否会增加参赛者赢得汽车的机率。如果严格按照上述的条件,那么答案是会。不换门的话,赢得汽车的几率是1/3。换门的话,赢得汽车的几率是2/3。
虽然该问题的答案在逻辑上并不自相矛盾,但十分违反直觉。代码实验一下。
import java.util.Random;
/**
* 三门问题
*
* @author xs
* create-time: 2021-06-03 14:28
*/
public class ThreeDoor {
public static void main(String[] args) {
int succCount = 0;
for (int i=0; i<1000000; i++) {
if (choose()) {
succCount ++;
}
}
System.out.println("1000000次成功了" + succCount + "次");
}
private static boolean choose() {
// 1. 初始化选择
Random ran = new Random();
int carNum = ran.nextInt(3);
int userChoose = ran.nextInt(3);
// 2. 删除一个错误答案
int removeNum = doRemove(carNum, userChoose);
// 3. 换门
int changeToNum = change(userChoose, removeNum);
return changeToNum == carNum;
}
private static int change(int userChoose, int removeNum) {
return 3 - userChoose - removeNum;
}
private static int doRemove(int carNum, int userChoose) {
// 0,1,2中排除错误答案,且不能为用户选择的门
Random ran = new Random();
int result = -1;
do {
result = ran.nextInt(3);
} while (result == carNum || result == userChoose);
return result;
}
}
实验结果:
1000000次成功了666848次
1000000次成功了666734次
1000000次成功了666356次
1000000次成功了666467次
1000000次成功了666649次
1000000次成功了666578次
1000000次成功了667333次
1000000次成功了666657次
1000000次成功了667355次
1000000次成功了666211次