最近看到一个有意思的概率题:
甲乙两人玩掷硬币的游戏。两人连续抛掷硬币,如果最近三次硬币的抛掷结果为“正反反”,则甲胜;如果是“反反正”,则乙胜。问:谁胜的概率更高?
可能大多数人和我一样,第一反应就是不都是1/8(1/2的三次方)的概率嘛。单纯看掷三次硬币的结果好像确实是这样。
来,我们做个小实验验证一下,用python来模拟一下(python代码如下):
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)
我们假设投掷100000次,并记录投掷序列中出现“正反反”和“反反正”次数,然后惊讶的发现结果竟然是这样子的:
甲(正反反)获胜次数: 74963
乙(反反正)获胜次数: 25037
为什么会这个亚子,甲赢的概率竟然是乙的三倍。实际上这是一个比较经典的概率游戏,它的原名叫做Penney’s game,于1969年被提出,在不少数学书籍和编程算法题中被引用。我们尝试从数学角度来解释一下:
首先我们要注意一下这个游戏的前提条件,“连续抛掷硬币”,这意味着投掷结果是一个序列,例如:正反正反…,我们再看一下甲乙的获胜子序列,“正反反”和“反反正”,甲获胜的可能性比较复杂,但是乙胜的情况却只能是从一开始就一直是反,如下:
反反正
反反反正
反反反反正
......
如果两个反之前一但有正,就会造成甲的胜利。因此乙获胜的概率就是:(1/2)**3 + (1/2)**4+(1/2)**5+…。
这是一个收敛的几何级数,也就是等比数列,可以通过公式求和:a1/(1-r)=(1/8)/(1-1/2) = 1/4。
如果还有些想不通,我们就来修改一下限定条件,我们每投掷三次就重新开始,代码如下:
import random
p1 = 0
p2 = 0
for i in range(100000):
last3 = []
for j in range(3):
last3.append(random.choice([0, 1]))
if last3 == [1, 0, 0]:
p1 += 1
elif last3 == [0, 0, 1]:
p2 += 1
print("甲(正反反)获胜次数:", p1)
print("乙(反反正)获胜次数:", p2)
结果如下:
甲(正反反)获胜次数: 12443
乙(反反正)获胜次数: 12527
这样甲乙获胜的概率就是一样的了,这种情况下甲乙获胜的情况相互独立,没有依赖关系,都是1/8。两种情况对比一下是不是就能理解了呢。
参考:
[1].https://mp.weixin.qq.com/s/GayvpEZXXS0vVI6Z4AOm1Q