使用 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 的实现是 documented当 p
超出范围时抛出异常。
关于C++ 11 std::binomial_distribution 不稳定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36762139/