线程安全的随机数

N0r*_*0rA 1 c++

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

我使用MS visual studio'10并使用OMP在C++中编写我的代码.

有帮助吗?

bam*_*s53 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();
});
Run Code Online (Sandbox Code Playgroud)

我只是std::async()用来表明生成器是在线程中创建的.MSVC 10没有std::async()我不想,但确实有<random>,所以你只需使用你已经使用的任何线程库就可以做同样的事情.