c++ - 线程安全的随机数

标签 c++

我试图以并行方式实现“Monte Carlo”算法,因此我需要使用随机数生成器的线程安全版本。
我搜索了很多,终于找到了 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> ,所以您只需使用您已经在使用的任何线程库就可以做同样的事情。

关于c++ - 线程安全的随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9606922/

相关文章:

c++ - 使用 Microsoft Access 数据库在 C++ 中进行 Unicode 转换

java - 获取 Java VM 引用,从 C++ 和并发创建 Java 对象

c++ - 如何替换字符串中所有出现的字符?

c++ - noexcept 究竟包含什么构造函数?

c++ - qt中如何彻底关闭窗口?

c++ - 为什么这不是函数模板的部分特化?

c++ - c++中类成员变量的构造顺序是未定义的吗?

c++ - 如何删除 QString 的前两个字符

c++ - 没有 OpenGL 的 SDL 抗锯齿?

c++ - 告诉我的计算器不要除以零