首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >线程安全随机数

线程安全随机数
EN

Stack Overflow用户
提问于 2012-03-08 02:16:11
回答 2查看 4.6K关注 0票数 1

我试图以并行方式实现“蒙特卡洛”算法,因此我需要使用随机数生成器的线程安全版本。

我搜索了很多次,最终找到了int qrand (),它是标准C++ rand()函数(在<cstdlib><stdlib.h>中定义)的线程安全版本。当我使用它时,VS触发了"identifier not found“错误。

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

有什么帮助吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-08 02:34:30

boost::random有许多生成器,它们都是对象。最简单的解决方案是为每个线程使用不同的生成器。

票数 3
EN

Stack Overflow用户

发布于 2012-03-08 02:49:25

对于C++,请使用标准的<random>库。正如James Kanze建议的那样,为每个线程使用不同的生成器可能是最好的,而且它们并不难制作:

代码语言:javascript
运行
复制
#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>,所以你可以使用你已经在使用的线程库来做同样的事情。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9606922

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档