给定 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 给出的解决方案给出了不需要循环的累积分布函数。
给定 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 给出的解决方案给出了不需要循环的累积分布函数。