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

SLURM上与时间相关的随机数种子的问题 所以我是一名暑期研究生,我有一个C++代码,运行随机数的模拟。我必须使用slurm调度程序运行大量这些代码。现在,我的代码在我的C++代码中作为随机数生成器的种子。但是,如果我同时运行同一代码的多个作业提交,因为每次将它们放入队列时,它们都需要大量的时间和资源来运行,并且通常都会在同一时间或在更大的组中启动,这意味着每次运行都会有相同的时间用于随机数生成器的种子,这是一个问题由于每次运行都需要唯一或尽可能接近此方法,因此有一种方法可以让每次运行为每次运行输入唯一的种子。 我目前正在尝试在批处理运行的主文件夹中自己的文件夹中运行每个作业,并给每个作业自己的输入文件一个由脚本生成的随机数,但这似乎效率低下。,c++,linux,C++,Linux,不要使用时间进行种子设定。通常最好使用从熵池中产生非确定性随机数的方法 例如: #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 = [&

不要使用时间进行种子设定。通常最好使用从熵池中产生非确定性随机数的方法

例如:

#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";
}

请注意,您应该只使用getrandom来提取用于种子设定的数字,否则在耗尽熵池时/如果耗尽熵池,您可能会遇到非常慢的随机数生成器。

使用` and seed with std::random_device。这如何使每次运行都是唯一随机的,而不只是通过遵循相同的伪随机集使每次运行再次相同号码?查一下。它应该是不确定的,尽管明吉瓦显然没有满足这一要求。请显示相关代码并说明确切的错误。也请看,当我看熵rd.entropy时,我得到的值是0 constantly,你在用哪个编译器?我认为clang可能有一个bug,当它不是0时,它会报告0。
#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";
}