在c ++中生成泊松变量
|
我实现了此功能以生成泊松随机变量
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);
}
其中最重要的是MersenneTwister随机数生成器。我发现,随着我增加lambda,预期分布将是错误的,均值将在750左右饱和。这是由于数值近似还是我犯了任何错误?
没有找到相关结果
已邀请:
5 个回复
师埠女
近似为
。
佩疵瓦
我在上面使用了两种方法: 我试图模仿您现有的界面。 如果您创建带有平均值的std :: poisson_distribution,则以相同的平均值反复使用该分布会更有效(如main()中所做的那样)。 这是我的示例输出:
梆晨灸碾
瞧叮
中使用
,因此实际上是在测试
。这不是很有帮助的转换。当然,您不再需要exp(-750),而是只溢出
。 现在,
只是Π(mrand.rand()),而log(p)是log(Π(mrand.rand()))是Σ(log(mrand.rand())。这将为您提供必要的转换:
“ 11”只有11位的指数,但有52位的尾数。因此,这极大地增加了数值稳定性。付出的代价是每次迭代都需要
,而不是单笔
。
夏瓤跋棘
然后生成一个随机数
,并取第一个整数
,使
。您可以通过二进制搜索找到此
。 要生成此表,我们需要各个概率
如果您发现
很大,这将变得非常不准确。但是,我们可以在这里使用一个技巧:以value21ѭ开始于(或接近)最大值,并假装
等于
。然后使用递归关系为
计算
对于for27ѭ使用
这样可以确保最大的概率具有最大的精度。 现在只需使用
计算
,直至
与
相同。然后,可以通过除以该极限值
来归一化数组。或者您可以保留数组原样,并使用随机数number34ѭ。 参见:http://en.wikipedia.org/wiki/Inverse_transform_sampling