使用系统时间的随机数都是一样的

Random numbers using system time all the same

本文关键字:一样 系统 时间 随机数      更新时间:2023-10-16

我在C++中编写了一个函数,该函数使用time.h的系统时间作为种子,并返回两个指定值之间的伪随机数。

#include <time.h>
int randInt(int min, int max)
{
    int nSeed = time(NULL);
    int nRandom = nSeed * 13;
    nRandom = nRandom % (max + 1);
    nRandom += min;
    return nRandom;
}

该函数完全执行它应该做的事情(据我所知)。但是,当我反复调用该函数时,例如,当使用 for 循环用伪随机数填充数组时,几乎没有时间过去,因此种子是相同的,使数组中的每个数字都相同。我该如何解决这个问题?有没有办法从系统中获取精度较小的时间?还是我完全错误地这样做?

你应该得到一个种子(例如时间),然后通过重复应用阶跃函数生成几个值。没有,你的"PRNG"只是一个适用于种子生成的哈希函数,这通常不是很随机。将种子与阶跃功能分离还允许确定性操作(固定种子)进行调试或可重现的结果。

正如其他人指出的那样,您不应该为每次调用函数重新设定种子。

但是,对于两次呼叫randInt,您获得相同号码的具体问题更有可能是由于time为单位返回时间。因此,在一秒钟内,对函数的所有调用都将使用完全相同的种子,从而返回完全相同的值。

但我强烈建议使用C++11的一部分<random>或boost::random,这对于旧版本的C++基本相同

生成一系列随机值时,不得重复为 PRNG 设定种子。仅播种一次,通常在程序开始时播种。

您遇到的问题是错误重新播种的明显后果。一个更严重的问题是,重新播种可能会破坏PRNG的分布特性。

您的PRNG的一个大问题是您不存储先前生成的值。这就是导致您每次采样时重新播种的原因。解决方案是记住 PRNG 生成的先前值,并从该值开始,而不是从 time(NULL) .

您可以简单地添加一些延迟或睡眠,以免在种子中具有相同的时间,但是正如其他人建议的那样,您不应该生成自己的PRNG,您可能需要添加一些鼠标位置,一些数据包接收或其他因素以增加随机性,但这仍然不是生成随机数的好方法。