我尝试以并行方式实现“蒙特卡罗”算法,因此我需要使用随机数生成器的线程安全版本。
我搜索了很多,终于找到了
int qrand ()
这是标准C ++ rand()
函数的线程安全版本(在<cstdlib>
和<stdlib.h>
中定义)。当我使用它时,VS解雇了“找不到标识符”错误。
我使用MS visual studio'10并使用OMP在C ++中编写了我的代码。
任何帮助?
答案 0 :(得分:6)
对于C ++,请使用标准<random>
库。正如James Kanze建议的那样,每个线程的不同生成器可能是最好的,并且它们并不难做出:
#include <random>
std::mt19937 make_seeded_engine() {
std::random_device r;
std::seed_seq seed{r(), r(), r(), r(), r(), r(), r(), r()};
return std::mt19937(seed);
}
std::async([](){
auto rand = std::bind(std::uniform_real_distribution<>(),
make_seeded_engine());
for(int i = 0; i < 100; ++i)
rand();
});
我只是使用std::async()
来表明生成器是在线程中创建的。 MSVC 10没有std::async()
我不认为,但它确实有<random>
,所以你只需使用你已经使用的任何线程库就可以做同样的事情。
答案 1 :(得分:3)
boost::random
有许多作为对象的生成器。该
最简单的解决方案是简单地为每个使用不同的发电机
线程。