我试图以并行方式实现“蒙特卡洛”算法,因此我需要使用随机数生成器的线程安全版本。
我搜索了很多次,最终找到了int qrand ()
,它是标准C++ rand()
函数(在<cstdlib>
和<stdlib.h>
中定义)的线程安全版本。当我使用它时,VS触发了"identifier not found“错误。
我使用MS visual studio'10,并使用OMP在C++中编写代码。
有什么帮助吗?
发布于 2012-03-08 02:34:30
boost::random
有许多生成器,它们都是对象。最简单的解决方案是为每个线程使用不同的生成器。
发布于 2012-03-08 02:49:25
对于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()
来说明生成器是在线程中创建的。我不认为MSVC10有std::async()
,但是它有<random>
,所以你可以使用你已经在使用的线程库来做同样的事情。
https://stackoverflow.com/questions/9606922
复制相似问题