【问题标题】:Why does std::poisson_distribution hang when passed a very large mean?为什么 std::poisson_distribution 在通过非常大的平均值时会挂起?
【发布时间】:2022-01-20 19:28:57
【问题描述】:

例如,以下代码挂起,将我的设置与最新版本的 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。但显然这并没有发生。这是预期的行为吗?

编辑:当我链接到 LLVM libc++ 时,泊松分布总是返回 LLONG_MAX,这是我所期望的。这是 GNU libstdc++ 错误吗?

【问题讨论】:

  • 使用std::cout,而不是printf。使用错误的输出格式说明符会导致未定义行为的风险。
  • @PaulMcKenzie 我已经更新了我的代码。我改编的代码甚至没有打印出随机数,所以我很确定这不是问题。

标签: c++ stl c++-standard-library libstdc++


【解决方案1】:

我们just discussed libstdc++ 规范化适合输出类型的概率分布部分(因此 相对 概率是正确的)而 libc++ 钳位 (以便 mean 尽可能正确)。在参数过大的情况下,前一种方法大大增加了预期的运行时间,但我会犹豫将其称为错误。

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

【讨论】:

  • 并为未来的读者澄清一下:GNU libstdc++ 一直从分布中采样,直到它在范围内,而 libc++ 在完整(双倍?)范围内采样一次,然后将其限制在范围内。
猜你喜欢
  • 2015-12-03
  • 1970-01-01
  • 2020-10-09
  • 1970-01-01
  • 2018-09-18
  • 2013-12-21
  • 2021-06-09
  • 2012-02-17
  • 1970-01-01
相关资源
最近更新 更多