c++ - std::poisson_distribution 中可能存在的构造错误

标签 c++ language-lawyer std

我不确定这是适合此评论/问题的平台,但请考虑以下代码片段:

#include <random>
#include <iostream>
#include <limits>
int main()
{
    int m=std::numeric_limits<int>::max();
    std::cout<<m<<"\n";
    std::poisson_distribution<int> p(m+1.);//implicit conversion to double
    std::mt19937 rng(std::random_device{}());
    auto x=p(rng);
    std::cout<<x<<std::endl;
    return 0;
}

代码编译并运行。虽然显然它没有正确地对分布进行采样,因为 50% 的时间 x 应该大于 m+1,但这是不允许的。在我的机器上,程序只输出小于 m 的数字,但这可能是一种未定义的行为。事实上,如果我打印 std::cout<<p.max()<<"\n";我得到m。 现在,我知道从数学上讲,我基本上是从正态分布中采样,并且我可以轻松解决这个问题。不过我想知道是否 当构造发行版或应在以下页面中添加注释时,应抛出运行时异常:https://en.cppreference.com/w/cpp/numeric/random/poisson_distribution 。 如果您同意我的观点,我应该联系谁?

最佳答案

所有泊松分布都支持所有非负整数。因此,总是有一些值由于太大而无法生成。有人可能会争辩说,这些值应该限制在一定范围内,或者应该重新绘制。对于合理的λ值,两者都没有任何实际效果,但选择不寻常的参数将迫使不可避免的选择成为主导效应。

关于c++ - std::poisson_distribution 中可能存在的构造错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70397376/

相关文章:

c++ - GCC 的 -Wpsabi 选项到底有什么作用?压制它有什么影响?

c++ - Mac OSX 构建中缺少 Allegro 5.2 TTF 插件

c++ - 在每个实例化中使用 lambda 作为唯一默认参数的模板

c++ - 为什么模板参数中的双冒号有效?

c++ - 加载共享库 : libstdc++. so.6 时出错:错误的 ELF 类:ELFCLASS64

c++ - C++中的map数据结构是什么

c++ - C++1 1's std::string' 的底层表示是否保证有终止空字符?

c++ - `std::set_intersection` 的 lambda 比较器

c++ - 显式默认构造函数

c++ - std::find 不使用我定义的 == 运算符