用c ++实现泊松分布

时间:2015-05-10 21:22:05

标签: c++ distribution factorial poisson

我正在尝试编写一个程序来计算泊松分布的概率质量函数,P(x = n),参数为lambda,使用以下公式:( (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,无符号多头的最大数量为18,446,744,073,709,551,615,小于30!

我该怎么办才能解决这个问题?在c ++中有没有其他方法或任何函数来计算这个prabability?

数据类型

3 个答案:

答案 0 :(得分:3)

如果只需要从泊松分布 生成 随机值,否则 需要知道它的概率质量函数,最直接的方法是使用属于C ++ 11的predefined distribution。类似的实现也可以在Boost中找到。

答案 1 :(得分:3)

尝试一些小数学

 (lambda^n))/n!

那不是

 (lambda/n) * (lambda/(n-1) * ...

这些数字可以通过双打来管理,而不是计算非常大的nunbers

答案 2 :(得分:3)

处理大型n的一种解决方法是计算日志域中的分布:

www.example.com/?json=posts.create_post&nonce=383nonce84&title=newpost&content=blahblabh&status=publish