This question already has answers here:
srand() — why call it only once?

(7个答案)


5年前关闭。




我在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;
}

如果我将这些代码行彼此相邻运行,则Rand1Rand2将会完全相同。
printf("Rand1 = %d\n", generateRandom(10, 46));
printf("Rand2 = %d\n", generateRandom(10, 46));

最佳答案

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

说明:

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

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

每次需要新的随机数时,都无需为序列设定种子。我不确定这一点,但是我有一种感觉,根据使用的PRNG算法,对每个新数字进行重新播种实际上可能会导致结果序列中的随机性降低。

关于c - srand(time(NULL))更改种子值的速度不够快,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5574914/

10-11 15:17
查看更多