在给定p的情况下,k胜出n的概率?

2024-06-07 14:15:15 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我的想法如下: 胜负的每一个组合都有概率p^w*(p-1)^(n-w),其中w是胜数。你知道吗

每次赢的次数都可能出现在nCr组合中,例如,3次赢2次意味着你可能会输掉第一次、第二次或第三次,例如3次组合。你知道吗

所以三次中赢两次的概率是3C2*p^2*(1-p)^1。 赢两次或两次以上的概率就是这两次和三次赢的计算的总和。你知道吗

我有以下代码:

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)

这段代码是有效的,但是是否有一个内置的函数,或者用一个较短的方法来实现相同的功能?你知道吗


Tags: 代码importreturndefmath概率次数at
2条回答

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这样的包,它有^{}用于有效的组合计算

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给出的解给出了不需要循环的累积分布函数。你知道吗

相关问题 更多 >

    热门问题