为什么 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
不会对预期行为做出巨大改变),只是一个关于如何在更复杂的场景中做这样的事情的注释。
#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
不会对预期行为做出巨大改变),只是一个关于如何在更复杂的场景中做这样的事情的注释。