srand(time(NULL))不会快速改变种子值

我用C写了一个简单的随机数生成器int l是下界, int u是上界。

它工作得很好,但是我有一个关于播种的问题。 如果我要在一个循环中运行它,那么time(NULL)不会快速地改变种子值,从而不能够获得连续的一系列完全相同的随机数。

我想知道其他人可能会如何解决这个问题。 我在网上find的所有例子都使用time(NULL)作为种子值生成器。

 int generateRandom(int l, int u) { srand(time(NULL)); int r = rand() % ((u - l) + 1); r = l + r; return r; } 

如果我要将这些代码紧挨着运行, Rand1Rand2将完全相同。

 printf("Rand1 = %d\n", generateRandom(10, 46)); printf("Rand2 = %d\n", generateRandom(10, 46)); 

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

说明:

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

要解决这个问题,您需要在每次运行应用程序时使用不同的种子(给出不同的序列)来自己种下PRNG。 通常的做法是使用基于当前时间设置种子的time(NULL) 。 只要你没有在一秒钟内启动应用程序的两个实例,就可以保证一个不同的随机序列。

每次你想要一个新的随机数时,不需要给序列播种。 我不确定这一点,但是我有这样的感觉:根据PRNGalgorithm的使用情况,重新播种每个新的数字可能实际上导致所得序列的随机性较低。

种子一次在主要开始。 如果你在同一秒内种太快,你最终会得到相同的数字。

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

此外,许多书籍build议不要使用C-lib标准随机函数。 如果您需要良好的伪随机数,Press等人的Numerical Recipes,3rd中有一个很好的algorithm。 版。

我假设你从另一个函数, main或其他东西调用generateRandom函数。

如果你在函数内声明种子,你将重置函数。 重置该function,会使相同的数字出现几次,同一秒钟。

移动srand(time(NULL)); 以主要function将解决问题。

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

产生更多样化的随机设置(在OSX 10.8上),包括短周期testing。

如果你使用不同的进程,使用(rand()+getpid())%range; 我用它来testing每秒多次随机值的同一个程序(如果你创build了rand数字,退出程序然后再次运行得非常快,数字将是相同的)