毒蘑菇和两只青蛙的有趣问题,一种反直觉的概率

今天刷到李永乐老师的一条视频,觉得挺有意思

题目是

你吃了一种毒蘑菇,不幸中毒了。有一种青蛙能够分泌解药,但是只有雌性青蛙能够分泌这种解药。这时,你发现前方有一只青蛙,后方有两只青蛙,你分不清它们的雄雌。这时,后面的两只青蛙中不知哪知青蛙叫了一声,你听出这是雄性青蛙的叫声。那么,你应该向前走,还是应该向后走,才能有更大的获救概率呢?

按直觉来讲,前后概率应该是一样的,但答案却是向后走的有雌性青蛙的概率为2/3。

我不信邪

用rust简单验证一下这道题目

use rand::Rng;

fn main() {
    let mut total = 0; // 总次数
    let mut front_female_total = 0; // 前方雌性次数
    let mut back_female_total = 0; // 后方雌性次数
    let mut rng = rand::thread_rng();

    while total < 10000 {
        // 同时生成3只随机性别的青蛙,0雌性  1雄性
        let front = rng.gen_range(0..2);
        let back1 = rng.gen_range(0..2);
        let back2 = rng.gen_range(0..2);

        // 确保后方的青蛙至少有一只雄性,排除掉雌雌
        if back1 == 0 && back2 == 0 {
            continue;
        }

        // 统计次数
        total += 1;

        if back1 == 0 || back2 == 0 {
            back_female_total += 1;
        }

        if front == 0 {
            front_female_total += 1;
        }
    }

    println!(
        "总次数:{},前方雌性次数{},后方雌性次数{}",
        total, front_female_total, back_female_total
    );
}

循环运行一万次,得到结果是

总次数:10000,前方雌性次数5087,后方雌性次数6645
总次数:10000,前方雌性次数4879,后方雌性次数6693
总次数:10000,前方雌性次数4965,后方雌性次数6689
总次数:10000,前方雌性次数4961,后方雌性次数6671
总次数:10000,前方雌性次数4929,后方雌性次数6578

验证出后方有雌性的几率接近2/3,可我用随机函数生成0或1,为什么会有这样的结果

其实玄妙之处在于,同时为三只青蛙随机生成了性别,并且剔除了雌雌这部分样本,所以导致我们统计的样本空间已经被经过了筛选,雌性青蛙的总数和样本总数下降相同的数量,那雌性青蛙和样本总数的比值自然会变小。

举个例子:

雌性青蛙(5000只) 样本总数(10000只) 比值为1:2,雌性占了一半

此时过滤掉2000只雌性青蛙

雌性青蛙(3000只) 样本总数(8000只) 比值为3:8,雌性占了三分之一

当然也可以换一种计算方式:在前后各随机生成一只雄雌青蛙,并在后方多补放一只雄性青蛙,此时是完整的样本空间,前后雄雌的概率都会为50%!

也让我想起漫士讲过的《同一个事件居然有三种概率?》

亦或者,较真的话,雄性青蛙身边的是雌性青蛙的概率更高。。。

补一张牛蛙的图

© 版权声明
分享是一种美德,转载请保留原链接
THE END

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

3人评论了“毒蘑菇和两只青蛙的有趣问题,一种反直觉的概率”

滚动至顶部