写在前面:
前阵子上概率论的时候,老师给了一个有趣的问题(好吧,知乎上也有,滑稽),其中牵涉到了墨菲定理,感触挺深,特将此分享给其他的读者朋友。
墨菲定律:
什么是墨菲定律?
墨菲定律是一种心理学效应,由爱德华·墨菲(Edward A. Murphy)提出的,亦称墨菲法则、墨菲定理。
墨菲定律的原句是:如果有两种或两种以上的方式去做某件事情,而其中一种选择方式将导致灾难,则必定有人会做出这种选择。
根本内容是:如果事情有变坏的可能,不管这种可能性有多小,它总会发生。
墨菲定律(Murphy's Law)主要内容有四个方面:
一、任何事都没有表面看起来那么简单;
二、所有的事都会比你预计的时间长;
三、会出错的事总会出错;
四、如果你担心某种情况发生,那么它就更有可能发生。
“墨菲定律”的根本内容是“凡是可能出错的事有很大几率会出错”,指的是任何一个事件,只要具有大于零的机率,就不能够假设它不会发生。
——《百度百科》
问题引入:
掷1000次硬币,出现连续十次(或以上)正面的概率是多少?
分析:
- 简单介绍一下递归算法:
可能还是有一些同学对递归算法也没什么概念,简单的回顾一下递归算法的两个解题要点:
(1)找到递归方程:递归方程的表述有点晦涩,白话点说,通常就是找到相邻两步之间的关系。例如经典汉诺塔问题中,移动3个圆环和移动2个圆环之间有什么关系?移动10个圆环和移动9个圆环之间有什么关系?进而推广到移动N个圆环和移动N+1个圆环之间有什么关系?
(2)找到递归边界:通常来说,就是把题目的条件改成一个很小的数字,并找到一个简单明确的答案。例如汉诺塔问题中,移动1个或2个圆环,都有显而易见的最优答案,就可以作为递归边界。
显而易见的,如果具备以上两个要素,就可以从递归的边界开始,根据递归方程,依次的推算出所有结果。基本和数学归纳法一个思想。递归的思想也可以说“用简单的事情重复做”的方法来解决复杂的问题。
- 2.本题的递归解题过程:
便于表述,先约定一下表述含义:
(1)目标事件:就是指出现至少一次连续10次或10次以上正面朝上这个事件,之后会简称为目标事件。
(2)P(n)代表的是,当总共扔n次硬币时,目标事件发生的概率为P(n)。例如当总共只扔10次时,出现连续10次都是正面的概率就记为P(10)。当连续扔1000次时,目标事件的发生概率就记为P(1000)。
明确了符号定义后,开始试着找出本题的递归边界和递归方程。
- 递归边界:
首先,本题的递归边界似乎很容易确定。
我们先不考虑扔1000次这么多,不妨先只考虑扔10次。总共只扔10次,要连续10次都是正面朝上的概率是多少?很显然,这个概率等于1/1024(2的10次方等于1024),也就是说P(10)=1/1024。当然,如果扔的总次数小于10次,那显然目标事件发生概率就是0了,因为连总次数都不足10次,不可能会出现连续10次正面朝上。也就是说当n<10时,P(n)=0。
至此,递归边界可以确定下来了。
- 递归方程:
寻找递归方程的问题,也就基本等价于“P(n)和P(n+1)之间,到底有什么关系?”也就是每当多出1次扔的机会时,概率如何变化?我们知道肯定是变大了,只是暂时不知道具体增加了多少而已。
如果我们成功找到了相邻两步之间的计算关系,那么显然就解题成功了。因为P(10)是明确等于1/1024,我们可以通过P(10)算出P(11),通过P(11)算出P(12),通过P(12)算出P(13)......以此类推,直至算出P(1000)。
至此,原本一个看着无从着手的问题,就变得很具体了,无非就是找出P(n)和P(n+1)之间的运算关系。
- 先从最简单的P(10)和P(11)的关系来看:
P(10)=1/1024。这个很明确,总共只扔10次,要10次都正面朝上,只有1种可能性,而总的可能性有1024种。
如果扔11次呢?显然扔11次得到连续10次正面朝上的概率肯定比只扔10次要大。那P(11)到底比P(10)大多少呢?
如果前10次已经出现了连续10次的正面,那么无论第11次扔正面还是反面,都已经满足条件,所以P(11)里已经完全包含P(10)。而扔11次相比扔10次多出来的机会只可能是:“前10次都没有出现,而恰好在抛第11次时,才首次出现了连续10个正面的情况”,也就是说扔到第10次时,已经扔出连续9次正面,接着第11次也扔了正面,从而刚好满足连续10次正面。
也就是说P(11)应该等于P(10)再加上恰好在第11次抛硬币时才首次发生目标事件的概率。
P(10)和P(11)的关系算是明确了,那么是不是所有的相邻关系都是如此呢?还不完全一样。
假设我们现在已经抛了50次,已经知道了P(50),那么P(51)和P(50)的关系是如何呢?首先他们的关系结构上应该也是一样的,也就是说P(51)应该等于P(50)再加上恰好在抛第51次时才首次发生目标事件的概率。只不过在计算这个新增概率时,需要考虑的情况会比之前稍复杂一些。
P(50)和P(51)的关系已经具备一般性,所以我们可以推广到更一般的P(n)和P(n+1)的关系了。
当n<20时,n-10<10,所以P(n-10)都等于0,递归方程均成立。
至此,递归边界和递归方程都已经找到了。
PS:这只是其中一种解法,比较容易理解,课上老师也是用的这种方法。其他解法可以上知乎查看,说实话其他解法我也不会。
代码实现【C++】:
这里用了一个循环,进行打表,再进行查询。
为什么不用递归做呢,因为实在是等不到结果,时间太长了(😭😭😭)。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int Maxsize=1e6+5;
int n;
double ans[Maxsize];
// 循环打表
void get_res()
{
memset(ans,0,sizeof(ans));// 初始化数组ans为0
ans[10]=1.0/(1<<10);
for(int i=10;i<1e6;i++)
{
ans[i+1]=ans[i]+(1-ans[i-10])/(1<<11);
}
}
int main()
{
get_res();
printf("input the total positive number:");
while(~scanf("%d",&n))
{
// 当输入小于等于0时,退出程序
if(n<1)break;
printf("the result is: %.20lf\n",ans[n]);// 直接查表,输出结果
printf("input the total positive number: ");
}
}
运行结果:
写在最后:
参考资料:
- 百度百科
- 维基百科
- 知乎:https://www.zhihu.com/question/46388875(问题来源)
- 知乎:https://www.zhihu.com/question/46388875/answer/522000121(内容、图片来源)
- bilibili(视频来源)
也许,是那么的遥不可及;也许,是那么的难以实现;也许,是那么的微乎其微。但是,只要有成功的概率,哪怕小到可以近似忽略,坚持去做,也可以逆天改命,完成逆袭。
不是说坚持就一定成功,但是不坚持,绝不会等来成功。就像抛硬币连续10次正面朝上,遇到这个问题,我们的第一反应会是,我的天,这个概率肯定特别低,但是,当抛的次数足够多的时候,概率就不断的接近1。
最后,分享一个视频,干了这碗毒鸡汤,一起加油!!!
网友评论