(一) 问题的提出
某灯设置有一个概率触发器,每0.1秒触发一次,每次15%几率点亮该灯,持续时间为1.4秒,若再次触发点亮时该灯已经点亮,则持续时间覆盖。求该灯一小时内处于点亮状态的期望
(二)分析问题
2.1基本分析:
在这个问题中,有一些问题需要界定,界定如下:第0s的时候判定触发器是否触发,来决定第0-0.1s的状态。前者对应时间轴上的点,后者对应时间轴上的线段。总共有36000个点 以及36000个时间段对于点来说,有触发,不触发两种状态;对于段来说,有亮与不亮两种状态。每个时间段有0.1s长
在这个过程中,前1.4s及前14段和第15段到第36000段有着明显的不同。
对于前14段的每N段(0≤N≤14):只要只要前N个点(第1到N)中有任何一个触发成功,则这一段既为亮的状态。
对于第15段到第36000段(15≤N≤36000):从正面想有一定困难,会涉及到多种情况讨论,但其对立面不亮的状态较为简单,只有第N段前的14个点均触发失败,第N段是不亮的状态,否则第N段为亮的状态。
2.2求解方法分析:
2.2.1第一种算法常规方法
需要求出所有可能情况,即设X为亮灯时常(X=0,0.1,0.2,……3600)的概率(X-P),然后再对X*P(X)累加,这种做法会涉及到3601种概率的计算,需要用到比较大的组合值求解,十分繁琐。
2.2.2第二种算法采取递归的方法
第一步算出N≤14的期望值:
可以采取常规方法求X*P(X)的累加
第二步算15≤N的情景:
前N秒亮的段数的期望记为A(N),则第N+1秒时:
A(N+1)=(0.85^13)[0.15*(A(N)+1)+0.85A(N)]+(1-0.85^13)*[A(N)+1]
解释一下这个地推公式:
公式分为两部分:
第一部分
(0.85^13)[0.15*(A(N)+1)+0.85A(N)]
(0.85^13)表示这一点(N+1点)之前的13个点都没有触发成功的概率
之后看第14点(N+1点),分为两种情况,
- 如果第14点触发(0.15概率)则总段数要在A(N)基础上加1,
即为0.15*(A(N)+1) - 如果第14点不触发(0.85概率)则总段数即为A(N)。
第二部分
(1-0.85^13)*[A(N)+1]
(1-0.85^13)表示这一点(N+1点)之前的13个点至少有一个触发成功的概率
这种情况下第N+1段一定为亮的状态,因此总段数要在A(N)基础上加1
(三)计算理论值
3.1前14段计算
亮灯0段的概率为0.85^14
亮灯1段的概率为(0.85^13)*0.15
...
亮灯X段的概率为(0.85^14-X)*0.15
...
亮灯14段的概率为(0.85^0)*0.15=0.15
在Excel种计算
3.214段之后计算
将14段作为初始值誊写
从第15段开始写入递推公式F3=
下拉到第36000段(可以在填充种选中序列填充到36000)
得到结果
(四)模拟实验值
4.1Excel模拟
在Excel 中插入一个按钮,点击按钮后开始模拟
按钮中写入如下代码
点击开始模拟
之后计算多次实验模拟结果的平均值
4.2 python 模拟
(五)近似值计算
假设不考虑前1.4s的特殊性,所有的段都遵循跟15-36000段一样的规则
则每一段亮的概率为前13个点触发成功加前13个点触发失败、14个点触发成功
近似算法A(N)=(1-0.85^13+(0.85^13)*0.15)*N
G2=
到36000时结果为
(六)总结
最终结果
在以上的过程中
用到了互斥事件通过求其补集的概率来求其概率
在常规方法较繁琐时使用递推方法计算
Excel中
1 .使用POWER(底数,指数)函数进行幂运算
2 .使用填充序列快速填充到36000
Vba中
1.设置按钮
2.定义数组
3.定义函数
4.使用MsgBox弹出对话框
python中
1.引入random模块模拟概率
其他注意事项
1.Vba中0.15的概率中 A<0.15 不能写为A ≤0.15
2.python中要严格注意缩进(吐槽一下python老卡在的格式问题,赞美一下Vba中自动帮你修改格式)
3.python模拟中存在系统性误差,次误差未查明原因
内容同步更新在公众号:蜘蛛见闻