- 帖子
- 176
- 精华
- 1
- 积分
- 733
- 阅读权限
- 100
- 注册时间
- 2013-8-21
- 最后登录
- 2020-12-20
|
我是一个概率控,平常遇到和概率相关的事情都喜欢去推算一下,喜欢看概率有关的影视作品(决胜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)
复制代码 运行后的结果:每次结果不会一样,但大致比例不变,基本上甲赢的概率是乙的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%这个范围)
多了解一些概率的知识,你会对这个世界有更准确的认知。
----
更多干货内容,欢迎搜索并关注:Crossin的编程教室
一起学,走得远!
|
|