首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++ exponential_distribution偶尔返回inf,其中0是预期的

C++ exponential_distribution偶尔返回inf,其中0是预期的
EN

Stack Overflow用户
提问于 2020-04-01 16:04:16
回答 1查看 136关注 0票数 0

在一个项目中,我正在生成数以百万计的世博( lambda )随机变量,其中lambda可能非常大。在使用std::exponential_distribution<float>时,我偶尔会得到inf的返回值。如果lambda接近于0,我会理解这一点,但是当lambda很大时,估计值非常接近于零。例如,以下程序通常在数百万次抽签后终止:

代码语言:javascript
复制
#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?除了手动检查输出是有限的之外,还有什么方法可以解决这个问题吗?谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-01 19:53:26

理查德·克里顿的评论说:

“如果...Some是浮动的,RealType实现可能偶尔返回无穷大。这是LWG发布的2524.”源(有指向问题的链接):分布

切换到double并不能解决这个问题,相反,它只是减少了看到它的机会(或者至少使它可以忽略不计)。正如LWG问题所指出的,根本的问题是generate_canonical (某些实现可以使用)在很少的情况下可能返回1.0,这样-log(1-generate_canonical())就可以输出无穷大。在实践中,floatdouble更可能出现这种情况,因为与double相比,generate_canonical可以用float生成的数字要少得多(实际上,2^24而不是2^53)。(无论如何,右尾分布的朴素实现还有其他问题,如指数分布;参见“恢复您的分位函数”)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60975271

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档