三门问题

376 阅读1分钟

问题描述

三门问题是一道经典的概率问题。

在一个电视节目中,有主持人和三个盒子,其中只有一个盒子里面有球,并且主持人是知道哪个盒子里面有球的,你的目标是拿到有球的那个盒子。游戏规则如下:

  1. 你首先选择一个盒子
  2. 主持人从剩余的两个盒子里面去掉没有球的一个盒子。
  3. 这时候你可以放弃自己最初的选择,换成另一个盒子。

问,你换还是不换?

答案

要换,换了之后中奖的概率会提高一点。

程序解释

N = 3


def generate():
    a = [0] * N
    a[np.random.randint(0, N)] = 1
    return a


def one():
    # 生成一个随机问题,返回不换门中奖的概率
    a = generate()
    # 让用户从中选择一个
    ind = np.random.randint(0, len(a))
    # 主持人随机推开一个空门
    empty = []
    for i, v in enumerate(a):
        if i == ind:
            continue
        elif v == 0:
            empty.append(i)
    # 主持人推开的门的下标
    rm = empty[np.random.randint(0, len(empty))]
    # 场上剩余的门
    left = [v for i, v in enumerate(a) if i != rm and i != ind]
    # 换门
    change = np.random.randint(0, len(left))
    return left[change]


def main():
    s = 0
    n = 100000
    for i in tqdm(range(n)):
        s += one()
    print('如果换门中奖的概率为', s / n)


main()

数学解释

下面我们推广到n个盒子,只有一个盒子有球。
如果不换,中奖的概率为1/n。
如果换了,中奖的概率需要分类讨论:

  1. 最初的选择是正确的(1/n的概率),那么你再换,中奖的概率为0
  2. 最初的选择是错误的,概率为(n-1)/n,那么你再换,中奖的概率为1/(n-2)

如果换了,中奖的总概率为
1n0+n1n(1/n2)=n1n×(n2)\frac{1}{n}*0+\frac{n-1}{n}*(1/n-2)=\frac{n-1}{n\times(n-2)}