一道有悖直觉的概率题

简介: 以前中学时代跟同学讨论概率,如果双方有分歧,就很难说服对方。即使有了一个结论,也无法确认到底是否正确。毕竟大多数时候,你不可能亲自去实验足够多的次数。

是一个概率控,平常遇到和概率相关的事情都喜欢去推算一下,喜欢看概率有关的影视作品(决胜21点、欺诈游戏、赌博默示录……),就连在汤姆熊或是巴黎人,我也会估下哪一个机器输的可能性更小一点(赢是不可能赢的啦)。

所以,碰到概率相关的问题,我通常都不会轻易放过。之前公众号里讲过的概率问题就有好几个:

最近,又看到一个有意思的概率题,今天给大家分享并分析一把:

甲乙二人玩掷硬币的游戏。两人连续抛掷硬币,如果最近三次硬币抛掷结果是“正反反”,则甲胜;如果是“反反正”,则乙胜。问:谁胜的概率更高?


各位先想一下,结果是什么?


单纯看扔3次硬币的结果,“正反反”和“反反正”出现的概率都是 1/8(1/2的3次方)。那么,是不是就代表两人胜的概率是一样的呢?


以前中学时代跟同学讨论概率,如果双方有分歧,就很难说服对方。即使有了一个结论,也无法确认到底是否正确。毕竟大多数时候,你不可能亲自去实验足够多的次数。


但有了计算机和编程之后,情况就好多了。只要你的代码没有问题,通常可以模拟出实验场景,得到一个参考结果来佐证。


今天这个问题,同样可以通过代码进行模拟:


单次掷硬币,正反面的概率各是50%,这个是没有疑问的。那我们只要根据这个概率持续地产生硬币结果序列,再判断最近三次硬币结果是否触发胜负条件即可。然后,重复这个过程足够多的次数,统计双方胜负的总数,就能得到两人胜负概率的参考值。


下面放下代码,如果你想自己尝试编写,先不急着看:



import random
p1 = 0
p2 = 0
for i in range(100000):
    last3 = []
    while True:
        x = random.choice([0, 1])
        last3.append(x)
        if len(last3) > 3:
            last3.pop(0)
        if last3 == [1, 0, 0]:
            p1 += 1
            break
        elif last3 == [0, 0, 1]:
            p2 += 1
            break
print('甲(正反反)', p1)
print('乙(反反正)', p2)

行后的结果:


甲(正反反) 74820
乙(反反正) 25181


每次结果不会一样,但大致比例不变,基本上甲赢的概率是乙的3倍


可能有人还是不太信。那我们再从数学的角度来尝试解释一下:


因为甲的后两位和乙的前两位是一样的,所以,对于进行中的序列,一旦出现“正”,乙就没有机会了。比如:


反正反正……


这样一个序列,如果出现乙胜的情况,必须先连出至少两个“反”,但这样就必定会形成“正反反”而导致甲胜。


所以甲胜的可能性比较复杂,但乙胜的情况只可能是从一开始就一直是“反”,包括:


反反正
反反反正
反反反反正
反反反反反正……

这个概率还是相对好计算的:

(1/2)**3 + (1/2)**4 + (1/2)**5 + (1/2)**6 + ...

(**是python中的指数运算)


这是一个收敛的几何级数,也就是等比数列,可以通过公式求和:

a1/(1-r) = (1/8)/(1-1/2) = 1/4


所以乙胜的概率就是 25%


这个游戏其实有点来头,它原名叫做 Penney’s game,于 1969 被提出,在不少数学书籍和编程算法题中被引用。


有人会问我,怎么能持续提高编程能力。其实,像这种“不起眼”的数学题,就是一种提高编程能力的很好方法。如果你也能没事拿起python,去算一算身边的概率,久而久之,你在处理更复杂问题时自然也会得心应手。


顺便说下,概率和分布在我们的周围普遍存在。比如我们文中的投票,如果你留心观察就会发现,在只有100个人投票和1000个人投票时,选项的分布是会很接近的。也就是说,虽然我们每个人都有着独立思维,但作为整体来看,却保持着稳定的分布特征。(比如我们的打卡活动,如果不去改动其他条件,完成率就总是在15%~20%这个范围)


多了解一些概率的知识,你会对这个世界有更准确的认知。





其他内容回复左侧关键词获取:

python :零基础入门课程目录

新手 :初学者指南及常见问题

资源 :超过500M学习资料网盘地址

项目 :十多个进阶项目代码实例


如需了解视频课程及答疑群等更多服务,

请号内回复码上行动

推荐阅读

经验:选专业 | Python转行 | 我用Python | 新手建议

干货:如何debug |  一图学Python  | 知乎资源 | 单词表

案例:漫威API | 爬抖音 | 查天气 | 监控大V | 红包提醒

相关文章
|
数据采集 API 开发工具
Baumer工业相机堡盟工业相机如何通过BGAPI SDK实现Raw格式的图像保存(C++)
Baumer工业相机堡盟工业相机如何通过BGAPI SDK实现Raw格式的图像保存(C++)
280 0
Baumer工业相机堡盟工业相机如何通过BGAPI SDK实现Raw格式的图像保存(C++)
|
4月前
|
数据采集 存储 安全
主数据到底要怎么管理?看完你就知道了
企业常因客户、产品等核心数据不统一导致部门间数据混乱、决策失准。主数据管理正是解决这一问题的关键,通过统一标准、打破孤岛、明确权责,实现数据一致与共享。本文提出五步实施框架,助力企业夯实数据基石,提升运营效率与决策能力。
|
机器学习/深度学习 测试技术
大模型开发:描述交叉验证以及为什么在模型评估中使用它。
交叉验证是评估机器学习模型性能的方法,通过将数据集分成训练集和多份子集(折叠)进行多次训练验证。每次选择一份子集作为验证集,其余作训练,最后平均评估结果。这样能减少过拟合,提供可靠性能估计,用于参数调优,并减少小数据集或噪声带来的随机性影响。它是模型评估的关键技术,确保更准确的性能估计。
636 1
|
人工智能 监控 安全
自学记录鸿蒙 API 13:骨骼点检测应用Core Vision Skeleton Detection
骨骼点检测技术能够从图片中识别出人体的关键骨骼点位置,如头部、肩部、手肘等,广泛应用于运动健身指导、游戏交互、医疗辅助、安全监控等领域。我决定深入学习HarmonyOS Next API 13中的Skeleton Detection API,并开发一个简单的骨骼点检测应用。通过理解API核心功能、项目初始化与配置、实现检测功能、构建用户界面,以及性能优化和功能扩展,逐步实现这一技术的应用。未来计划将其应用于健身指导和智能监控领域,探索与其他AI能力的结合,开发更智能的解决方案。如果你也对骨骼点检测感兴趣,不妨一起进步!
458 9
|
机器学习/深度学习 人工智能 算法
AI学习
学习AI涉及编程语言(如Python)、数学基础、AI理论(包括机器学习、深度学习)、实践应用(如使用TensorFlow)、案例研究、伦理法律及持续跟进最新技术。从基础知识到项目实战,全面掌握AI需要扎实的理论与实践经验,关注领域发展,并具备跨学科协作能力。对于个人职业发展和适应未来社会,AI技能至关重要。
1067 3
|
数据挖掘 BI
数字化产科管理平台解决方案
数字化产科管理平台旨在解决产科应用痛点,通过建设孕产保健信息系统,实现保健、临床及上级管理系统间的互联互通,打造一体化服务模式。平台涵盖门诊、住院、统计三大模块,实现从建档到产后管理的全生命周期管理,提升高危管理效率,减少人工文书工作,优化资源配置,并提供精准的统计分析功能,助力科研与业务发展。
355 0
数字化产科管理平台解决方案
|
JavaScript 小程序 前端开发
前端(九)——探索微信小程序、Vue、React和Uniapp生命周期(上)
前端(九)——探索微信小程序、Vue、React和Uniapp生命周期(上)
435 0
|
并行计算 API 流计算
Flink之处理函数 (ProcessFunction)1
Flink之处理函数 (ProcessFunction)
745 0
|
存储 安全 Java
基于SpringBoot+Vue健身房管理系统的设计与实现(源码+部署说明+演示视频+源码介绍)(1)
基于SpringBoot+Vue健身房管理系统的设计与实现(源码+部署说明+演示视频+源码介绍)
622 1
|
存储 搜索推荐 算法
Java中的数组排序技术详解
Java中的数组排序技术详解
286 0

热门文章

最新文章