C++ 11 std::binomial_distribution 不稳定

标签 c++ c++11 random

使用 std::binomial_distribution 时由 clang++ 实现,我看到一些非常不愉快的行为:

default_random_engine rng;

vector<double> p{0.2500000000000000000000000000000000000000,
                 0.3333333333333333148296162562473909929395,
                 0.5999999999999999777955395074968691915274,
                 1.0000000000000002220446049250313080847263};

for (auto &i : p) {
  binomial_distribution<int> binom(1000, i);
  cout << binom(rng) << " ≈ " << 1000 * i << endl;
}

结果如下:

254 ≈ 250
340 ≈ 333.333
598 ≈ 600
628 ≈ 1000 # WAT? - should be around 1000

奇怪的是,如果您尝试调用 binomial_distribution<int>(100, p[3]) , 它永远挂起。后一种行为后来是不可取的,但在意料之中 - 成功的概率不应超过 1 .

如果您想知道,p 的上述值来自使用 conditional binomial method 生成多项式变量在适应gsl_ran_multinomial .

我的编译器是 clang++El Capitan 10.11.4

Apple LLVM version 7.3.0 (clang-703.0.29)
Target: x86_64-apple-darwin15.4.0

谢谢!

最佳答案

正如您已经说过的,p(成功的概率)必须小于或等于 1。在 Clang 的当前实现中,似乎正在传递一个无效值,使其重新使用以前的值(在您的情况下为 0.5999)。

简而言之,您似乎在调用未定义的行为。什么事情都可能发生。 Boost 的实现是 documentedp 超出范围时抛出异常。

关于C++ 11 std::binomial_distribution 不稳定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36762139/

相关文章:

c++ - 在头文件中使用命名空间时的多重定义

c++ - 对 3X3 或 4X4 行列式进行单元测试

c++ - 迭代基本类型时使用 const 引用有什么缺点吗?

java - Java Random 和 Kotlin Random 的区别

algorithm - 随机选择

c++ - 使用 atoi 的不同结果

c++ - Visual C++ 中的预处理器#warning 等价物?

c++ - boost::PO 不能绑定(bind)到 ‘std::basic_ostream<char>&&’

c++ - 如何创建带参数的 packaged_task?

haskell - 生成范围内随机整数的唯一列表