在一个项目中,我正在生成数以百万计的世博( lambda )随机变量,其中lambda可能非常大。在使用std::exponential_distribution<float>时,我偶尔会得到inf的返回值。如果lambda接近于0,我会理解这一点,但是当lambda很大时,估计值非常接近于零。例如,以下程序通常在数百万次抽签后终止:
#include<iostream>
#include<random>
int main(void)
{
std::random_device rd;
std::mt19937 generator(rd());
float lambda = 1000000.0;
float val = 0;
for(int i = 0; i < 1000000000; ++i)
{
std::exponential_distribution<float> dist(lambda);
val = dist(generator);
if(isinf(val))
{
std::cout << i << " " << val << " failure" << std::endl;
exit(0);
}
}
return 0;
}如果函数中有一些错误(由于精度原因),为什么返回inf而不是更方便的0.0?除了手动检查输出是有限的之外,还有什么方法可以解决这个问题吗?谢谢。
发布于 2020-04-01 19:53:26
理查德·克里顿的评论说:
“如果...Some是浮动的,RealType实现可能偶尔返回无穷大。这是LWG发布的2524.”源(有指向问题的链接):分布
切换到double并不能解决这个问题,相反,它只是减少了看到它的机会(或者至少使它可以忽略不计)。正如LWG问题所指出的,根本的问题是generate_canonical (某些实现可以使用)在很少的情况下可能返回1.0,这样-log(1-generate_canonical())就可以输出无穷大。在实践中,float比double更可能出现这种情况,因为与double相比,generate_canonical可以用float生成的数字要少得多(实际上,2^24而不是2^53)。(无论如何,右尾分布的朴素实现还有其他问题,如指数分布;参见“恢复您的分位函数”)。
https://stackoverflow.com/questions/60975271
复制相似问题