假设我有这个循环:
for (i=0; i < 100; i++)
{
srand(time(NULL));
printf("%d\n", rand());
}
如果我的机器相当快,它应该打印相同的数字 100 次。
但是如果我这样修改它:
for (i=0; i < 100; i++)
{
srand(time(NULL) + rand());
printf("%d\n", rand());
}
然后它应该打印 100 个不同的数字。我的问题是,像这样播种随机发生器有什么问题吗?那效率呢?是否会显着降低效率?
一个附带问题,如果我在 main()
函数中植入随机数发生器一次,对于其他函数是否也足够(即我不需要在另一个使用它的函数中再次植入它) rand()
)?
编辑
我可能需要使用这种方式是有原因的(当然除非有更好的方式我不知道)。假设我有一个自定义库,其中的函数使用 rand()
。但该函数不知道随机发生器之前是否已播种。在这种情况下,我将 srand(time(NULL) + rand()) 放入该函数中,以确保随机化器已播种,即使之前未播种。
示例:
int main()
{
int i;
srand(time(NULL)); // Seeded here, but the print_rand() function does not know it
for (i=0; i < 100; i++)
{
print_rand();
}
return(0);
}
// Pretend this function is in a library
void print_rand()
{
srand(time(NULL) + rand()); // No guarantee if seeding was done before, so doing it here
printf("%d\n", rand());
}
编辑2
我刚刚用 1000000 次循环对其进行了测试。播种一次需要 0.024s
,每次播种需要 4.972s
。所以我想如果它是一个大循环,它确实会导致性能显着下降。
最佳答案
不要这样做。
播种一次。
srand(time(NULL) + rand());
如果重复使用会引入统计偏差。直观上,这是由于两个影响:(i) srand(rand())
将有效地忽略所有其他会增加方差的数字,并且 (ii) srand(time(NULL))
将引入一个额外的加法常量,这将导致生成器中的模运算符被比应有的情况更频繁地调用。您甚至可能会损害生成器的周期性。
为什么不测试一下呢?我预计平均值将大致正确,但我想象方差和更高的时刻将会关闭。
关于c - 如果这样做的话,可以多次播种随机发生器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32203768/