STLの「ランダム」を使用して、二項分布の乱数を生成しています。範囲が大きいと極端に遅くなります。範囲が 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 ミリ秒かかります。