我试图以并行的方式实现“蒙特卡洛”算法,所以我需要使用线程安全版本的随机数生成器。
我搜索了很多,终于发现 int qrand()
这是标准的C++ rand()
功能,(在<cstdlib>
和<stdlib.h>
定义)的线程安全版本。当我使用它时,VS解雇了“标识符未找到”错误。线程安全随机数
我使用MS visual studio'10并使用OMP在C++中编写我的代码。
任何帮助?
我试图以并行的方式实现“蒙特卡洛”算法,所以我需要使用线程安全版本的随机数生成器。
我搜索了很多,终于发现 int qrand()
这是标准的C++ rand()
功能,(在<cstdlib>
和<stdlib.h>
定义)的线程安全版本。当我使用它时,VS解雇了“标识符未找到”错误。线程安全随机数
我使用MS visual studio'10并使用OMP在C++中编写我的代码。
任何帮助?
boost::random
有一些发生器是对象。最简单的解决方案是简单地为每个线程使用不同的生成器。
对于C++使用标准<random>
库。正如詹姆斯甘孜建议,为每个线程不同的生成很可能是最好的,他们是不难作出:
#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>
,所以你只需使用你已经使用的线程库就可以做同样的事情。
您可能感兴趣的这个问题http://stackoverflow.com/questions/8285067/c-super-fast-thread-safe-rand-function – 2012-03-07 18:22:37
我觉得'qrand'是Qt的一部分,不是标准的C++。也许你正在寻找'rand_r'? – 2012-03-07 18:34:08
请参阅http://stackoverflow.com/a/7114482/5987特别是有关并发性的部分。 – 2012-03-07 18:38:53