You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

替代循环式随机通过率算法的失败次数概率权重计算求助

替代循环式随机通过率算法的失败次数概率权重计算求助

大家好,我是做计算机工程(软件方向)的,不是数学专业出身,所以除了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次通过前的失败次数和对应的频率:

失败次数频率
00.91353420
10.08134433
20.00486673
30.00024296
40.00001138
50.00000039
60.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时的计算结果:

失败次数概率
00.88473600
10.07962624
20.00477757
30.00023888
40.00001075
50.00000045
60.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时的计算结果:

失败次数概率
00.02881600
10.00170544
20.00008469
30.00000380
40.00000016
50.00000001
60.00000000

备注:内容来源于stack exchange,提问作者Jason Brown

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 08:24:36