线程安全随机数

Thread safe random numbers

本文关键字:随机数 安全 线程      更新时间:2023-10-16

我试图以并行方式实现"蒙特卡罗"算法,因此我需要使用线程安全版本的随机数生成器
我找了很多,终于找到了int qrand ()它是标准C++rand()函数(在<cstdlib><stdlib.h>中定义)的线程安全版本。当我使用它时,VS引发了"找不到标识符"错误。

我使用MS visual studio‘10,并使用OMP用C++编写代码。

有什么帮助吗?

对于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>,所以只要使用已经使用的任何线程库,就可以做同样的事情。

boost::random有许多作为对象的生成器。这个最简单的解决方案是简单地为每个线