gpt4 book ai didi

c++ - c++11在另一个线程中提前生成随机数

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:05:00 26 4
gpt4 key购买 nike

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

最佳答案

使用有界队列,让一个线程将随机数插入该队列,并在队列已满时让该线程阻塞在队列上。要获得一个随机数,请从该队列中拉出一个数字,并在队列为空时让消费者线程阻塞在队列上。

当队列中有空间且 cpu 时间可用时,这个简单的设计将让生产者产生随机数。

优化:使用带有随机数列表的队列。在这种情况下,生产者将产生一个带有随机数的完整列表。消费者将保留一个缓存(可能在 EXPGenerator 内部),其中包含队列外的列表。一旦缓存为空,缓存将被队列中的新列表填充。这将减少上下文切换开销,并且应该(当然)仅在测量显示有意义时才应用。

队列基本上应该是一些 std::deque,T 是一个随机数,或者 std::vector(随机数列表)。使用互斥锁来同步对该 std:queue 的访问并使用两个条件变量。第一,表示有空间再次插入更多随机数。一个表示队列中已经至少有一个元素。当队列为空时让消费者等待第二个条件,当队列满时让生产者等待第一个条件。

关于c++ - c++11在另一个线程中提前生成随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17291302/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com