三门问题的分析与推广
问题:
有三个门在你的面前,其中一个门后有奖品,其他两扇门后为空。
你首先选择一扇门但不打开。
之后会在剩下的两扇门中,打开一扇空门。
现在给你两个选择:
- 选择自己之前选择的那扇门
- 选择剩下的那扇门
问:
怎样选择获得奖品的概率更高?
分析:
一般人:
我第一次选中的概率为 1/3,那我第二次的基数变为2,那我的选中概率岂不是提升为 1/2,选中和没选中概率不是相等的吗?怎么会跟高呢?
误区:
概率不会提升,自己第一次选择中的概率,和空门打开没有关系,概率仍然是 1/3 (无关事件不会影响概率)
抽中概率没有变,但是判断手上有奖的概率为 1/2
科学分析:
- 如果我一直不改变的我的选择, 那么我中奖的概率为 1/3
- 如果我改变我的选择,那么我中奖的概率为多少呢?
如果我第一次选择为有奖的,那么我换门就没有中奖
如果我第一次选择的没有奖,那么我换门就一定中奖
所以换门中奖的概率为(我第一次没选中奖品的概率)2/3
代码模拟
import java.util.LinkedList;
import java.util.Random;
public class ThreeDoor {
public static void main(String[] args) {
for(int k = 0;k < 5;k++){//多次测试
int res=0;// 统计中奖的次数
for (int i = 0; i < 1000000; i++) {//重复进行1000000次统计中奖的次数
if (threeDoor(3))
res++;
}
System.out.println(String.format("%.2f",res/1000000.0));//输出概率
}
}
public static boolean threeDoor(int n){
LinkedList<Boolean> doors = new LinkedList<>();
Random random = new Random();
int t = random.nextInt(n);//随机门后有奖品
for (int i = 0; i < n; i++) {
if(i==t)
doors.add(true);
else
doors.add(false);
}
doors.remove(random.nextInt(n));//第一次随机抽奖
if (doors.getFirst())//打开空门
doors.removeLast();
else
doors.removeFirst();
return doors.remove(random.nextInt(n-2));//返回结果
}
}
运行结果:
结论
结果稳定在 2/3 的概率抽中 所以分析正确
推广
假设现在有 N 个门 ,其中有一个门有奖品 ,其他都为空。
你首先选择一扇门但不打开。
之后会在剩下的 N-1 扇门中,打开一扇空门。
现在给你两个选择:
- 选择自己之前选择的那扇门
- 在剩下的其他门中另外选择一扇
问
第一个选择选中奖品的概率是多少?
第二个选择选中奖品的概率是多少?
分析
- 如果我一直不改变的我的选择, 那么我中奖的概率为 1/N
- 如果我改变我的选择,那么我中奖的概率为多少呢?
如果我第一次选择为有奖的,那么我换门就没有中奖
如果我第一次选择的没有奖,那么我换门就我就有 1/(N-2)
所以换门中奖的概率为(我第一次没选中奖品的概率 * 我换门中奖的概率)(N-1)/(N*(N-2))
(N-1)/(N*(N-2)) > 1/N (易证)
所以换门赢得概率高
代码模拟
取 N = 4 那么换门概率为 (3/4)*(1/(4-2)) = 3/8 为 0.375
import import java.util.LinkedList;
import java.util.Random;
public class ThreeDoor {
public static void main(String[] args) {
for(int k = 0;k < 5;k++){//多次测试
int res=0;// 统计中奖的次数
for (int i = 0; i < 1000000; i++) {//重复进行1000000次统计中奖的次数
if (threeDoor(4))
res++;
}
System.out.println(String.format("%.3f",res/1000000.0));//输出概率
}
}
public static boolean threeDoor(int n){
LinkedList<Boolean> doors = new LinkedList<>();
Random random = new Random();
int t = random.nextInt(n);//随机门后有奖品
for (int i = 0; i < n; i++) {
if(i==t)
doors.add(true);
else
doors.add(false);
}
doors.remove(random.nextInt(n));//第一次随机抽奖
if (doors.getFirst())//打开空门
doors.removeLast();
else
doors.removeFirst();
return doors.remove(random.nextInt(n-2));//返回结果
}
}
模拟结果:
结论
数据稳定在 0.375 左右 结论推导正确