srand(time(NULL))不会足够快地更改种子值

Chr*_*ris 19 c

我在C中编写了一个简单的随机数生成器,int l它是下限,int u是上限.

它运作得很好,但我有一个关于播种它的问题.如果我在循环中运行它,time(NULL)不会足够快地更改种子值,以防止获得完全相同的连续系列随机数.

我想知道其他人怎么可能解决这个问题.我在网上找到的所有例子都time(NULL)用作种子值生成器.

int generateRandom(int l, int u)
{
   srand(time(NULL));

   int r = rand() % ((u - l) + 1);
   r = l + r;

   return r;
}
Run Code Online (Sandbox Code Playgroud)

如果我是紧挨着彼此碰撞的几行代码,无论是Rand1Rand2是完全一样的.

printf("Rand1 = %d\n", generateRandom(10, 46));
printf("Rand2 = %d\n", generateRandom(10, 46));
Run Code Online (Sandbox Code Playgroud)

And*_*per 23

srand(time(NULL))应该只运行一次以使PRNG初始化.在应用程序启动时在Main中执行此操作.

说明:

PRNG(伪随机数发生器)根据所使用的算法生成确定的数字序列.给定的算法将始终从给定的起点(种子)产生相同的序列.如果您没有明确地为PRNG设定种子,那么每次运行应用程序时它通常都会从相同的默认种子开始,从而导致使用相同的数字序列.

要解决此问题,您需要在每次运行应用程序时使用不同的种子(以提供不同的序列)为PRNG播种.通常的方法是使用time(NULL)根据当前时间设置种子.只要您不在一秒钟内启动应用程序的两个实例,就可以保证不同的随机序列.

每次需要新的随机数时都不需要对序列进行播种.我不确定这一点,但我觉得根据所使用的PRNG算法对每个新数字进行重新播种实际上可能导致所得序列中的随机性降低.

  • 至少,重新种植对质量没有帮助,即使它没有受到伤害.这样做,至少每次都是从'time(NULL)`播种. (2认同)

jon*_*sca 8

在主要开始时播种一次.如果你在同一秒内重新设置太快,你最终会获得相同的数字.


小智 6

srand( (unsigned) time(NULL) * getpid());

产生更多样化的随机集(OSX 10.8),包括短周期测试.


Sam*_*nen 5

不要每次都播种,只在节目的开头.

此外,许多书籍建议不要使用C-lib标准随机函数.如果您需要良好的伪随机数,那么Press等人的数字食谱,第3版就有一个很好的算法.版.

  • 不过请注意NR,本书中代码的许可条款非常繁琐,如果您键入它,我基本上禁止任何形式的版本控制或网络文件存储! (2认同)