我正在尝试编写一个程序来计算参数为 lambda 的泊松分布 P(x=n) 的概率质量函数,使用以下公式:( (e^-lambda)*(lambda^n ))/n!
当我使用较小的 lambda 和较小的数字时,这种方法很有效,但是如果我想用 lambda 20 计算例如 P(x=30),结果是 4.68903e+006,这是错误的。
我认为问题在于计算 n!。我实现了一个计算阶乘值的函数,阶乘计算的结果使用了unsigned long long
数据类型,但是问题是数量是30!等于 265,252,859,812,191,058,636,308,480,000,000 并且 unsigned long long 可用的最大数量为 18,446,744,073,709,551,615,小于 30!。
我应该怎么做才能处理这个问题?有没有其他方法或函数可以在 C++ 中计算这种概率?
数据类型
最佳答案
处理大 n 的一种解决方法是计算对数域中的分布:
X = ((e^-lambda)*(lambda^n))/n!
ln X = -lambda + n*ln(lambda) - Sum (ln(n))
return e^X
关于c++ - 在 C++ 中实现泊松分布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30156803/