我正在使用STL的“random”生成二项分布的随机数。当范围很大时,它变得非常缓慢。对于范围为40,生成100个数字需要12秒。对于更大的范围,时间增长得非常快(我需要大约10000的范围)。它似乎不取决于概率参数。我正在使用g++ 4.5.0。
#include <iostream>
#include <random>
using namespace std;
vector<int> v;
default_random_engine gen(123);
binomial_distribution<int> rbin(40,0.7);
int main(){
v.reserve(2000);
for(int i=0; i<100;++i){
v.push_back(rbin(gen));
}
}
输出:
50.~/.../fs/> g++ -std=c++0x q.cpp
51.~/.../fs/> time ./a.out
real 0m12.102s
user 0m12.094s
sys 0m0.002s
52.~/.../fs/>
我可以使用正态近似,但对于概率参数的极值情况效果不佳。
更新: 使用'-O3'选项后,时间变为约2秒。使用g++ 4.6.3版本,问题完全消失 - 时间几乎不依赖于范围,并且生成100个数字只需5毫秒。