gpt4 book ai didi

c++ - SLURM 上的时间相关随机数种子出现问题

转载 作者:太空宇宙 更新时间:2023-11-04 04:52:07 24 4
gpt4 key购买 nike

所以我作为一名暑期学生研究员,我有一个 C++ 代码,可以运行需要随机数的模拟。我必须使用 slurm 调度程序运行大量这些代码。现在,我的代码将时间作为 C++ 代码中随机数生成器的种子。但是,如果我同时运行相同代码的多个作业提交,因为它们每次放入队列时都需要大量的时间和资源来运行,并且通常都会在同一时间或在更大的组中开始,这意味着每次运行对于随机数生成器的种子都有相同的时间,这是一个问题,因为每次运行都需要是唯一的(或尽可能接近此方法)是否有一种方法可以让每次运行为每次运行输入唯一的种子。我目前正在尝试在批处理运行的主文件夹中自己的文件夹中运行每个作业,并为每个作业提供一个由脚本生成的随机数,但这似乎效率低下。

最佳答案

不要利用时间来播种。通常最好使用 std::random_device从熵池中产生不确定的随机数。

示例:

#include <iostream>
#include <random>

int main() {
std::random_device rd;
std::mt19937 generator(rd());
std::uniform_int_distribution<uint32_t> dist20(1, 20);
auto d20 = [&](){ return dist20(generator); };

// generate 100 random numbers [1,20]
for(int i=0; i<100; ++i)
std::cout << d20() << "\n";
}

但是,在 std::random_device 的某些实现中,即使熵池不为空,也会错误地报告熵为 0。在 Linux 上,您可以尝试使用 getrandom() 直接从池中提取数据并将其用于播种。这是一种方法:

#include <iostream>
#include <random>

// https://github.com/llvm-mirror/libcxx/blob/master/src/random.cpp#L175
#include <errno.h>
#include <sys/random.h>

std::random_device::result_type backup_seed() {
std::random_device::result_type seed;
if(getrandom(&seed, sizeof(seed), 0) == sizeof(seed)) errno = 0;
return seed;
}

std::random_device::result_type seed() {
errno = EAGAIN;
static thread_local std::random_device rd;
if(rd.entropy()) return rd();
return backup_seed();
}

int main() {
std::mt19937 generator(seed());
std::uniform_int_distribution<uint32_t> dist20(1, 20);
auto d20 = [&]() { return dist20(generator); };

// generate 100 random numbers [1,20]
for(int i = 0; i < 100; ++i) std::cout << d20() << "\n";
}

请注意,您应该只使用 getrandom() 来提取用于播种的数字,否则当/如果耗尽熵池时,您将面临随机数生成器非常慢的风险。

关于c++ - SLURM 上的时间相关随机数种子出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55211948/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com