我编写了以下代码来计算概率。我知道我使用的公式是正确的。该代码为 m 和 n 的较小值提供了合理的结果。但是,对于 m 和 n 的较大值,结果 sumC 在间隔[0,1]之外,这是不期望的。变量 iter 具有较大的值,这可能是原因。我该如何解决这个问题?
import math
from scipy.special import comb
n = 50
m = 100
k = 15
P=[]
sumC = 0
for j in range(k, m+1):
if not (n-j < 0):
iter = (-1)**(j+k) * comb(j, k, exact=True) * comb(m, j, exact=True) * math.factorial(n) * (m-j)**(n-j) /( (m)**(n) * math.factorial(n-j))
sumC = sumC + iter
print(sumC )
答案 0 :(得分:1)
使用精度为50位的Python mpmath arbitrary precision library会产生[0,1]范围内的值。
from scipy.special import comb
from mpmath import fac, mp
mp.dps = 50; mp.pretty = True
def compute_prob(k, m, n):
""" Original summation, but using factorial ('fac') from mpmath """
sumC = 0
for j in range(k, m+1):
if not (n-j < 0):
iter_ = (-1)**(j+k) * comb(j, k, exact=True) * comb(m, j, exact=True) * fac(n) * (m-j)**(n-j) /( (m)**(n) * fac(n-j))
sumC = sumC + iter_
return sumC
n = 50
m = 100
k = 15
print(compute_prob(k, m, n))
输出
0.000054845306977312907595945622368606216050228369266162