我是概率迷。我平时遇到概率相关的东西就喜欢做计算。喜欢看概率相关的影视作品(二十一点、作弊游戏、赌博启示录……),即使是汤姆熊或巴黎人,我也会估计哪台机器输的可能性小(不可能赢)。所以,遇到概率相关的问题,我一般不会轻易放过。前面公众号提到的几道概率题:三门题、蜥蜴流感和贝叶斯定理,几道有趣的概率题,还有一个略显怪异的计算pi的程序。发现一道有趣的概率题,今天就和大家分享分析一下:A和B玩掷硬币游戏。如果连续抛同一枚硬币,如果最后三次抛硬币的结果是“正面和反面”,则A获胜;如果是“正面和反面”,则B获胜。问:谁获胜的概率更大?大家先想想,结果是什么?A获胜的概率很高(正面和反面),B获胜的概率很高(正面和反面)。两个人的概率是一样的。简单看抛3次硬币的结果,“正面和反面”和“正面和反面”的概率是1/8(1/2的3次方)。那么,是不是说两人获胜的概率是一样的呢?我曾经和我的中学同学讨论概率。如果双方不同意,就很难说服对方。即使有结论,也无法确认是否正确。毕竟,大多数时候,你自己试验的次数是不够的。但是有了计算机和编程,事情变得更好了。只要你的代码没有问题,你通常可以模拟实验场景,得到一个参考结果来证明。今天的问题也可以用代码来模拟:抛一次硬币,正面和反面的概率是50%。这是毫无疑问的。那么我们只需要根据这个概率不断产生硬币结果序列,然后判断最后三个硬币结果是否触发了输赢条件。然后,重复这个过程足够多次,统计双方的总输赢次数,就可以得到双方输赢概率的参考值。把代码放下面,如果你想自己写试试,先别急着看:▼▼▼▼▼importrandomp1=0p2=0foriinrange(100000):last3=[]whileTrue:x=random.choice([0,1])last3.append(x)iflen(last3)>3:last3.pop(0)iflast3==[1,0,0]:p1+=1breakeliflast3==[0,0,1]:p2+=1breakprint('A(reverse)',p1)print('B(reverse)',p2)运行后结果:A(reverse)74820B(reverse)25181结果不会每次都一样,但是大概的比例是一样的。基本上,A获胜的概率是B的三倍,有些人可能还不相信。那么我们试着从数学的角度来解释一下:因为A的后两位和B的前两位相同,所以,对于正在进行的序列,一旦出现“正”,B就没有机会了。举个例子:反正,反正……这样的顺序,如果B赢了,至少要连续进行两次“反转”,但这肯定会形成“正面反面”,导致A获胜。所以A获胜的可能性比较复杂,而B获胜的情况只能是从一开始就被“反转”了,包括:反正,反正……这个概率比较好计算:(1/2)3+(1/2)4+(1/2)5+(1/2)6+...(**是python中的指数运算)这是一个收敛的几何级数,即几何序列,可以用公式求和:a1/(1-r)=(1/8)/(1-1/2)=1/4,所以B获胜的概率是25%。这个游戏其实有点背景。它最初被称为Penney的游戏,于1969年提出,并在许多数学书籍和编程算法问题中被引用。有人会问我,如何才能不断提高自己的编程能力。其实,这样“不起眼”的数学题,是提高编程能力的好方法。如果你能拿起python计算身边的概率,久而久之,在处理更复杂的问题时自然得心应手。顺便说一下,概率和分布就在我们身边。比如我们文章中的投票,仔细观察会发现,只有100人投票和1000人投票时,选项的分布会很接近。换句话说,虽然我们每个人都有独立思考,但作为一个整体,我们保持着稳定的分布特征。(比如我们的签到活动,如果其他条件不变,完成率永远在15%~20%之间)多了解概率,你对这个世界会有更准确的认识.----更多干货欢迎搜索关注:Crossin的编程课堂一起学习,走的更远!
