我不确定这是适合此评论/问题的平台,但请考虑以下代码片段:
#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/