在 C++ 中实现泊松分布
implementing Poisson distribution in c++
我正在尝试编写一个程序来计算参数为 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++ 中计算这种概率?
数据类型
如果只需要从泊松分布生成个随机值,否则not需要知道它的概率质量函数,最直接的方法是使用C++中的predefined distribution 11.在 Boost 中也可以找到类似的实现。
尝试一点数学
(lambda^n))/n!
那不是吗
(lambda/n) * (lambda/(n-1) * ...
并且这些数字可以用双精度来管理,而不是计算非常大的数字
处理大 n 的一种解决方法是计算对数域中的分布:
X = ((e^-lambda)*(lambda^n))/n!
ln X = -lambda + n*ln(lambda) - Sum (ln(n))
return e^X
我正在尝试编写一个程序来计算参数为 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++ 中计算这种概率?
数据类型
如果只需要从泊松分布生成个随机值,否则not需要知道它的概率质量函数,最直接的方法是使用C++中的predefined distribution 11.在 Boost 中也可以找到类似的实现。
尝试一点数学
(lambda^n))/n!
那不是吗
(lambda/n) * (lambda/(n-1) * ...
并且这些数字可以用双精度来管理,而不是计算非常大的数字
处理大 n 的一种解决方法是计算对数域中的分布:
X = ((e^-lambda)*(lambda^n))/n!
ln X = -lambda + n*ln(lambda) - Sum (ln(n))
return e^X