今天刷到李永乐老师的一条视频,觉得挺有意思
题目是
你吃了一种毒蘑菇,不幸中毒了。有一种青蛙能够分泌解药,但是只有雌性青蛙能够分泌这种解药。这时,你发现前方有一只青蛙,后方有两只青蛙,你分不清它们的雄雌。这时,后面的两只青蛙中不知哪知青蛙叫了一声,你听出这是雄性青蛙的叫声。那么,你应该向前走,还是应该向后走,才能有更大的获救概率呢?
按直觉来讲,前后概率应该是一样的,但答案却是向后走的有雌性青蛙的概率为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
我已经被毒到出现幻觉了,马上就死了,俗称三步倒,还需要青蛙吗?
每走两步吃一口蘑菇,重置步数
想起来,小学水池进水放水的数学题,真是浪费水资源!