c++ RNG:如何在不同的处理器上获得不同的rand生成器

C++ RNG: how to get different rand generators on different processors?

本文关键字:rand 处理器 RNG c++      更新时间:2023-10-16

我如何播种随机生成器,以便我在不同的处理器上有不同的数字序列?

我的第一个尝试是使用处理器的排名作为种子。然后我艰难地发现srand(0)srand(1)给出了相同的序列。

当前,我正在这样做:

srand(time(NULL) + rank)

这是一个OK的方法吗?还是有更好的办法?由于

生成rand()初始化time(NULL)的不同种子,并将该种子传递给您的进程/线程。是的,使用不同于rand()的内容

在多线程环境中调用time()来播种RNG是自找麻烦。线程可以得到相同的时间,也可以得到不同的时间,这很难控制。就像你最初所做的那样,使用处理器排名为RNG提供种子,但要么使用一个对任何种子都表现良好的像样的RNG,要么如果你必须使用rand(),只需调整排名以获得稍微更好的种子,例如rank * 5 + 123;

如果您在*nix环境上,请使用/dev/random/dev/urandom作为您的熵源。在Windows上,调用CryptGenRandom()