使用clang++(libstdc++)时std::binomial_distribution特定输入下永久挂起
std::binomial_distribution在clang搭配libstdc下的挂起问题分析
问题场景与复现代码
使用clang搭配libstdc标准库编译代码时,发现std::binomial_distribution存在异常行为:程序输出第一行结果后无限挂起,无论设置何种PRNG种子,都会在执行第二行时卡住。复现代码如下:
#include <ctime> #include <random> #include <iostream> unsigned binom(unsigned n, double p) { std::mt19937 e(time(NULL)); std::binomial_distribution<unsigned> b(n, p); return b(e); } int main() { std::cout << "sample1=" << binom(1073741823, 0.51174692866744709) << "\n"; std::cout << "sample2=" << binom(1073741824, 0.51174692866744709) << "\n"; }
问题分析
这不是未定义行为,代码中的参数完全符合C++标准对std::binomial_distribution的要求:n为合法的非负无符号整数,p落在[0,1]区间内。
问题根源在于libstdc++对std::binomial_distribution的实现缺陷:当n取较大值(如2^30)且p接近0.5时,其内部采用的BTPE算法会进入无限循环,导致程序挂起。这属于标准库实现的bug,而非代码本身的问题。
另外需要注意,代码中每次调用binom函数都用time(NULL)重新初始化随机数生成器,若两次调用间隔小于1秒,会得到相同的随机种子,但这并非导致挂起的原因。
内容的提问来源于stack exchange,提问作者Floyd Everest
相关产品推荐
相关产品推荐

