我是一个概率控,平时遇到和概率相干的事件都喜爱去推算一下,喜爱看概率无关的影视作品(决胜 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% 这个范畴)
多理解一些概率的常识,你会对这个世界有更精确的认知。
—-
更多干货内容,欢送搜寻并关注:Crossin 的编程教室
一起学,走得远!