为什么 std::poisson_distribution 在传递一个非常大的均值时挂起?

Why does std::poisson_distribution hang when passed a very large mean?

例如,将我的设置与最新版本的 g++ 和 GNU 库一起使用时,以下代码挂起:

#include <random>
#include <cstdio>

std::default_random_engine rng;

int main(){
    std::poisson_distribution<long> mine(34387423874230847234.0);
    std::printf("%ld\n", mine(rng));
}

Try it online

min 和 max 函数的描述 here 似乎暗示它将输出限制为类型参数的最大可能值,在本例中为 long。但显然这不会发生。这是预期的行为吗?

编辑:当我 link 反对 LLVM libc++ 时,泊松分布总是 returns LLONG_MAX,这更符合我的预期。这是 GNU libstdc++ 错误吗?

我们 just discussed libstdc++ 规范化 符合输出类型的概率分布部分(因此 相对 概率是正确的),而 libc++ clamps 它(因此 mean 尽可能正确)。在参数大到无用的情况下,前一种方法大大增加了预期的运行时间,但我不愿将其称为错误。

minmax 成员函数描述了可能发生的情况,并且是准确的:它们并不暗示实现这种情况的任何机制。