为什么 srandom(time(NULL)) 在 main() 函数和用户定义函数中的行为不同?

Why does srandom(time(NULL)) behave differently within main() function and that of a user defined function?

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void sep_gen(void);

int main()
{
srandom((unsigned)time(NULL));
printf("Random Numbers\n");

sep_gen();
sep_gen();
sep_gen();

return(0);
}

void sep_gen(void)
{
long int r;
int i;

for (i=0;i<10;i++)
    putchar('-');
putchar('\n');

r=random();
printf("%ld\n",r);
}

以上代码按预期生成了三个不同的整数。但是,当使用 srandom((unsigned)time(NULL)) sep_gen() 函数时,生成的整数在所有三次中都是相同的。 (下面的代码)

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void sep_gen(void);

int main()
{
printf("Random Numbers\n");

sep_gen();
sep_gen();
sep_gen();

return(0);
}

void sep_gen(void)
{

srandom((unsigned)time(NULL));
long int r;
int i;

for (i=0;i<10;i++)
    putchar('-');
putchar('\n');

r=random();
printf("%ld\n",r);
}

我的问题是为什么当 srandom() 函数放在主函数中时 random() 函数生成不同的数字,但在 sep_gen() 函数中却不这样做?

这是因为您的代码处理速度很快。 srandom 所做的是重置随机数生成器的种子。如果你在一个函数中调用它,它会在你调用函数的任何时候更新为当前时间。计算速度如此之快,以至于每次调用都检索到相同的时间,因此生成的数字与给定种子的序列的第一个数字相同。

将它放在 sep_gen 中意味着每次调用 sep_gen 时都重新播种,而不是每个程序一次 运行。 time 返回自纪元以来的秒数;您的程序可能会在同一秒内全部调用 sep_gen 三次,因此您在每次 random 调用之前重新播种到固定的起点。

基本上,作为一项规则,一个程序应该只为其随机源播种一次,或者如果它出于任何原因需要重新播种,需要确保它不使用变化不够大的种子源。一个真正简单的重新播种而不重复自己的方法类似于 srandom(time(NULL) ^ random());,因此生成器的现有状态扰乱了变化不足的外部种子源,time()。这只是一个玩具示例(不断扰乱 time 不会对预期行为做出巨大改变),只是一个关于如何在更复杂的场景中做这样的事情的注释。