一起来做几道有趣的概率题
大家好,欢迎来到 Crossin 的编程教室。
看到一篇叫做《和上帝一起掷骰子》的文章,里面提到了很多概率有关的问题,不少经过计算得出的概率都与人第一看上去产生的直觉大相径庭。今天在这里分享几个有趣的例子,来看看你的直觉和数学上的概率是否一致。
一个例子:
若1千人中有1人携带x病毒,有一种可以百分之百检测出病毒携带者的检查。但这种检查对于没有携带的人,有5%的可能性误检出是携带者。现在随便找了一个人,检查后呈阳性,也是就携带者。那么他真的是携带者的可能性是多大?
这里,我们不考虑各种其他条件。看上去5%误检率是很低的。但其实,这人真正携带x病毒的概率只有1.96%。
1 / (999 × 5% + 1)
而就算他连着2次检测都是阳性,实际带病概率也不过 1 / (999 × 5% × 5% + 1) ≈ 28.6%
所以在实际中,遇到检测阳性的情况,通常都需要再次复检从而尽可能排除假阳性的可能。
另一个例子:
一辆出租车在雨夜肇事,一个目击证人说,车是蓝色的。已知:目击证人在当时场景下正确记忆并区分蓝绿色的准确率是80%,而该地85%的出租车是绿色,15%是蓝色。那么那辆车是蓝色的概率有多大?
按理说,眼见为实,八成不会错。但那车是蓝色的概率仅有41.38%。
(15% × 80%) / (85% × 20% + 15% × 80%)
最后,也是我觉得最有意思的,是这样一个问题:
有个人,生了俩孩子,已知其中一个是男孩,这个男孩的生日是星期二,问另一个小孩是男孩的概率。
直觉上似乎觉得,你生几个小孩,每个小孩是男孩的概率不都是1/2吗?这跟你是不是星期二生的有啥关系啊!但答案是13/27。
你看了可能不信。那么为了验证,我写了一段程序来模拟这个场景:
one_tuesday_boy = 0one_tuesday_boy_plus_another_boy = 0for gender1 in ['m', 'f']:for birth1 in range(1, 8):for gender2 in ['m', 'f']:for birth2 in range(1, 8):if (gender1 == 'm'and birth1 == 2) or (gender2 == 'm'and birth2 == 2):one_tuesday_boy += 1if gender1 == 'm'and gender2 == 'm':one_tuesday_boy_plus_another_boy += 1print one_tuesday_boy_plus_another_boy, '/', one_tuesday_boy
因为假设生男生女还一周七天出生的概率都是一样的,那么一共就有2×7×2×7=196种相等概率的可能性。通过程序枚举得到,其中有一个周二出生的男孩的情况是27种,这27种中又是两个男孩的情况是13种。很暴力地得到了答案。
如果本文对你有帮助,欢迎点赞、评论、转发。你们的支持是我更新的动力~