为了进行一些c++的数值模拟,我需要生成许多指数分布的随机数(所有随机数都具有相同的预定分布)。目前,我的程序运行良好,但超过50%的CPU时间用于生成这些随机数。
我想做的是以不阻塞模拟主循环的方式生成这些随机数。更准确地说,我想要一个线程,其工作是始终保持一个随机数“提前准备好”,并在某人读取此随机数时立即生成新的随机数。
有人知道一个不错的方法来实现这个吗?
目前,我的顺序代码如下:
#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]