c++ - 在 C++ 中实现泊松分布

标签 c++ distribution factorial poisson

我正在尝试编写一个程序来计算参数为 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/

相关文章:

java - 在java中计算大于整数和长整数的阶乘?

java - 我想取出JAVA中BigInteger中存储的大数的最后一位

c++ - R 的 sum() 和 Armadillo 的 accu() 之间的区别

c++ - 如何在使用 TensorRT C++ API 编写的 TensorRT 模型上运行半精度推理?

c++ - Windows 上的模板有什么问题?有哪些解决方案?

xcode - 没有可用于签名的身份 - 在 xcode 中发布应用程序

python - 如何从朴素贝叶斯分类器中的概率密度函数计算概率?

r - 计算 R 中连续分布的 Anderson-Darling 检验统计量

c++ - 累积没有给出我的 vector 的正确总和

计算 100 阶乘中的数字和