替代循环式随机通过率算法的失败次数概率权重计算求助
替代循环式随机通过率算法的失败次数概率权重计算求助
大家好,我是做计算机工程(软件方向)的,不是数学专业出身,所以除了PEMDAS之外的数学公式对我来说理解起来有点费劲,希望尽量用直白的方式交流~
我现在要把一款旧软件移植到新环境,得保证功能行为完全一致,但又想优化原来那种比较朴素的循环算法。先给大家看看原来的核心逻辑代码:
Pass = 0 Fail = 0 while Pass < Total: Percent = Random( 1 to 100 inclusive ) if Percent < 97: Pass += 1 elif Percent == 97: break elif Percent > 97: Fail += 1 Pass = Total return Pass, Fail
用大白话解释这个算法就是:不断掷100面的骰子,直到拿到Total次“通过”为止。掷出的结果小于97就算通过;大于97就算失败,而且一旦失败就直接终止循环;等于97的话,也直接终止循环,不会再有失败的可能。
我的目标是彻底去掉这个循环,直接计算任意Total值对应的失败次数的概率,然后用带权重的随机选择来生成失败次数(比如Failures = Weighted Random( 1 to Total, with weights[ 1 to Total ] )),但我不知道怎么计算这些权重。
我自己写了个程序跑原来的算法,当Total=3的时候,统计了拿到3次通过前的失败次数和对应的频率:
| 失败次数 | 频率 |
|---|---|
| 0 | 0.91353420 |
| 1 | 0.08134433 |
| 2 | 0.00486673 |
| 3 | 0.00024296 |
| 4 | 0.00001138 |
| 5 | 0.00000039 |
| 6 | 0.00000001 |
我就是搞不懂怎么把权重缩放成和这个统计结果匹配的样子,也不确定这个问题属于数学里的哪个领域,希望能得到大家的帮助~
后来在WW1和Misha Lavrov的帮助下,我找到了对应的计算方法,分享给有同样需求的朋友:
1. 计算「失败n次且在遇到97之前就拿到了t次通过」的概率函数P(n, t)
def P(n, t): return binomialcoeff(t + n - 1, n) * pow(0.96, t) * pow(0.03, n)
当t=3时的计算结果:
| 失败次数 | 概率 |
|---|---|
| 0 | 0.88473600 |
| 1 | 0.07962624 |
| 2 | 0.00477757 |
| 3 | 0.00023888 |
| 4 | 0.00001075 |
| 5 | 0.00000045 |
| 6 | 0.00000002 |
2. 计算「失败n次且在拿到t次通过之前遇到了97」的概率函数S(n, t)
def S(n, t): sigma = 0 for k in range(0, t): sigma += binomialcoeff(n + k, k) * pow(0.96, k) * pow(0.03, n) return sigma * 0.01
当t=3时的计算结果:
| 失败次数 | 概率 |
|---|---|
| 0 | 0.02881600 |
| 1 | 0.00170544 |
| 2 | 0.00008469 |
| 3 | 0.00000380 |
| 4 | 0.00000016 |
| 5 | 0.00000001 |
| 6 | 0.00000000 |
备注:内容来源于stack exchange,提问作者Jason Brown
相关产品推荐
相关产品推荐

