对于 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]