我实现了这个函数来生成泊松随机变量
typedef long unsigned int luint;
luint poisson(luint lambda) {
double L = exp(-double(lambda));
luint k = 0;
double p = 1;
do {
k++;
p *= mrand.rand();
} while( p > L);
return (k-1);
}
其中 mrand 是 MersenneTwister 随机数生成器。我发现,当我增加 lambda 时,预期分布将会出错,均值在 750 左右饱和。这是由于数值近似还是我犯了任何错误?
如果您选择“现有库”路线,您的编译器可能已经支持 C++11 std::random 包。以下是使用方法:
#include <random>
#include <ctime>
#include <iostream>
std::mt19937 mrand(std::time(0)); // seed however you want
typedef long unsigned int luint;
luint poisson(luint lambda)
{
std::poisson_distribution<luint> d(lambda);
return d(mrand);
}
int main()
{
std::cout << poisson(750) << '\n';
std::poisson_distribution<luint> d(750);
std::cout << d(mrand) << '\n';
std::cout << d(mrand) << '\n';
}
我在上面使用了两种方式:
我试图模仿你现有的界面。
如果您创建一个带有均值的 std::poisson_distribution,那么反复使用该分布来获得相同的均值会更有效(如 main() 中所做的那样)。
这是我的输出示例:
751
730
779
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)