【发布时间】:2018-12-01 21:56:22
【问题描述】:
这可能是一个非常简单的问题,但我对 C++ 上的随机数生成非常陌生,并希望确保我得到它是正确的。
我有一个随机函数,我想多次并行运行,因此函数的每次并行运行都需要与其他运行不同,并且与以前的运行不同,据我了解,我可以这样做的一种方法是将 random_device 作为每个的种子。例如
for (int i= 0; i< runs; i++){
//do something
#pragma omp parallel for schedule(static)
for (int j = 0; j < std::size(iters); j++){
std::mt19937 mrandThread(std::random_device{}());
iters.at(j) = stochFunction(parameters, mrandThread);
}
//do something
}
但是,这似乎在计算上会很昂贵,因为您会多次启动 random_device,尤其是在上述循环重复很多次的情况下。另一个问题是运行可能会重复,因为 random_device 只是设置一个种子,它可能会再次出现?但是,目前从循环外部传递引擎,例如
std::mt19937 mrandThread(std::random_device{}());
for (int i= 0; i< runs; i++){
//do something
#pragma omp parallel for schedule(static)
for (int j = 0; j < std::size(iters); j++){
iters.at(j) = stochFunction(parameters, mrandThread);
}
//do something
}
意味着每个线程都给出相同的结果,因为它们只是从并行发送的那一点开始运行梅森捻线机的副本?我见过的另一个选择是使用 rand_r(),但这是否可能再次出现类似于种子重复的问题,或者这更像是当前随机轨迹集在循环外的分支?
任何关于如何最好地实现这一点的建议将不胜感激。
【问题讨论】:
-
您可以简单地为每个线程分配它自己的随机生成器实例(使用不同的种子)。这样,您只需分配种子
次,而不是每次迭代。
标签: c++ random parallel-processing mersenne-twister