三门问题的分析与推广

时间:2024-02-01 10:45:10

问题:

有三个门在你的面前,其中一个门后有奖品,其他两扇门后为空。
你首先选择一扇门但不打开。
之后会在剩下的两扇门中,打开一扇空门。
现在给你两个选择:

  1. 选择自己之前选择的那扇门
  2. 选择剩下的那扇门

问:

怎样选择获得奖品的概率更高?


分析:

一般人:

我第一次选中的概率为 1/3,那我第二次的基数变为2,那我的选中概率岂不是提升为 1/2,选中和没选中概率不是相等的吗?怎么会跟高呢?

误区:

概率不会提升,自己第一次选择中的概率,和空门打开没有关系,概率仍然是 1/3 (无关事件不会影响概率)
抽中概率没有变,但是判断手上有奖的概率为 1/2

科学分析:

  1. 如果我一直不改变的我的选择, 那么我中奖的概率为 1/3
  2. 如果我改变我的选择,那么我中奖的概率为多少呢?

如果我第一次选择为有奖的,那么我换门就没有中奖
如果我第一次选择的没有奖,那么我换门就一定中奖
所以换门中奖的概率为(我第一次没选中奖品的概率)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. 选择自己之前选择的那扇门
  2. 在剩下的其他门中另外选择一扇

第一个选择选中奖品的概率是多少?
第二个选择选中奖品的概率是多少?

分析

  1. 如果我一直不改变的我的选择, 那么我中奖的概率为 1/N
  2. 如果我改变我的选择,那么我中奖的概率为多少呢?

如果我第一次选择为有奖的,那么我换门就没有中奖
如果我第一次选择的没有奖,那么我换门就我就有 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 左右 结论推导正确