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

How to define a vector of random engines with different seeds?

本文关键字:种子 随机 向量 引擎 何定义 定义      更新时间:2024-09-29

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

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

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++。


编辑

嗯,也许

std::vector<std::default_random_engine> generators(n);
for(i = 0; i < n; i++) {
std::default_random_engine generator(seeds[i]);
generators[i] = generator;
}

您给出的示例似乎适用于编译器资源管理器。这里的函数变成了一个函数,每个CPU生成一个生成器和线程,并使用C++20将生成器赋予lambda。

#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()