我正在尝试编写一个程序来计算泊松分布的概率质量函数,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?
数据类型
答案 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