给定 p,k 胜出 n 的概率?

Probability of k wins out of n, given p?

给定 n 次试验,每次试验获胜的概率为 p,赢得 r 次或更多次试验的概率是多少?

我的思路是这样的: 每个输赢组合的概率为 p^w * (p-1)^(n-w),其中 w 是获胜次数。

每个获胜次数都可以出现在 nCr 组合中,例如。 win out 2 out 3 times 意味着你可能会输掉第一次、第二次或第三次,例如三种组合。

所以3次赢2次的概率是3C2 * p^2 * (1-p)^1。 中奖2次以上的概率就是本次计算中2次和3次中奖的总和。

我有以下代码:

import math

def nCr(n,r):
    f = math.factorial
    return f(n) / f(r) / f(n-r)

def prob_at_least(n, r, p):
    probs = [nCr(n,k)*pow(p,k)*pow(1.0-p,n-k) for k in range(r, n+1)]
    return sum(probs)

此代码有效,但是否有内置函数或实现相同功能的更短方法?

much faster ways to implement combinations:

import operator as op
from functools import reduce

def nCr(n, r):
    r = min(r, n-r)
    numerator = reduce(op.mul, range(n, n-r, -1), 1)
    denominator = reduce(op.mul, range(1, r+1), 1)
    return numerator / denominator

但是如果你经常这样做,你可能需要考虑像 scipy 这样的包,它有 special.comb 用于高效的组合计算

scipy.stats 模块中,您可以使用 binom

>>> import scipy.stats as scs
>>> print(scs.binom.pmf(2, 5, .5))
0.3125

编辑:获得 r 或更多:

>>> trials = 0
>>> n = 5
>>> r = 2
>>> p = .5
>>> for i in range(r):
    trials += scs.binom.pmf(i, n, p)
 r_or_more = 1 - trials

编辑:ljeabmreosn 给出的解决方案给出了不需要循环的累积分布函数。