C ++でのいくつかの数値シミュレーションでは、指数分布で多くの乱数を生成する必要があります(すべて同じ事前定義された分布で)。現在、私のプログラムは問題なく動作していますが、CPU 時間の 50% 以上がこれらの乱数の生成に費やされています。
私がやりたいことは、シミュレーションのメイン ループをブロックしない方法でこれらの乱数を生成することです。より正確には、乱数を常に「事前に準備」しておき、誰かがこの乱数を読み取ったときにすぐに新しい乱数を生成するスレッドが必要です。
これを行う良い方法を知っている人はいますか?
現在、私の順次コードは次のようになっています。
#include <stdio.h>
#include <iostream>
#include <random>
using namespace std;
// exponential random variable with parameter lambda
class EXPGenerator{
exponential_distribution<> expo;
mt19937 engine; //mersene twister
public:
EXPGenerator(double lambda){
expo = exponential_distribution<>(lambda);
engine = mt19937(time(NULL));
}
double step(){
return expo(engine);
}
};
int main(int argc, char *argv[])
{
EXPGenerator expgen(2.0);
for(int i=0; i<100000; i++) {
double randv(expgen.step());
std::cout << randv << endl;
// do something complicated
}
return 0;
}
を使用してコンパイルしますclang++ -O2 --std=c++11 --stdlib=libc++ test.cpp -o test
[編集: 上記の -O2 を追加]