首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何定义具有不同种子的随机引擎的向量?

如何定义具有不同种子的随机引擎的向量?
EN

Stack Overflow用户
提问于 2020-11-15 03:42:55
回答 1查看 67关注 0票数 2

因为我使用多线程,所以我需要定义多个随机引擎,每个线程一个。

如果我知道有4个线程,我会这样做:

代码语言:javascript
复制
  std::default_random_engine generator1(1);
  std::default_random_engine generator2(10000);
  std::default_random_engine generator3(20000);
  std::default_random_engine generator4(30000);
  std::vector<std::default_random_engine> generators = 
    {generator1, generator2, generator3, generator4};

但是如何处理任意数量的线程呢?如果这是显而易见的,很抱歉,我不熟悉C/C++。

编辑

嗯,也许吧

代码语言:javascript
复制
std::vector<std::default_random_engine> generators(n);
for(i = 0; i < n; i++) {
  std::default_random_engine generator(seeds[i]);
  generators[i] = generator;
}
EN

回答 1

Stack Overflow用户

发布于 2020-11-15 05:41:16

您给出的示例似乎在Compiler Explorer上有效。下面的函数变成了一个函数,它为每个CPU生成一个生成器和线程,并使用C++20将生成器提供给一个lambda。

代码语言:javascript
复制
#include <vector> // std::vector
#include <random> // std::default_random_engine
#include <thread> // std::thread
#include <cstdint> // std::size_t
#include <ranges> // std::ranges
#include <functional> // std::ref

void foo() {

auto exec = [](std::default_random_engine &random) {
    return random();
};

std::vector<std::default_random_engine> generators;
std::vector<std::thread> threads;
const std::size_t concurrency = std::max(1u, std::thread::hardware_concurrency());
threads.reserve(concurrency);
generators.reserve(concurrency);
for (const auto & i : std::ranges::views::iota(0u,concurrency) )
{
    generators.emplace_back(i * 1000);
    threads.emplace_back(exec, std::ref(generators.back()));
}
for (auto & t : threads )
{
    t.join();
}

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

https://stackoverflow.com/questions/64837931

复制
相关文章

相似问题

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