#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((无符号)时间(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()函数放在main函数中时random()函数生成不同的数字,但是在sep_gen()函数中却没有这样做?
答案 0 :(得分:2)
这是由于代码的快速处理。 srandom
做的是重置随机数生成器的种子。如果您在一个函数中调用它,它将在您调用函数时随时更新当前时间。计算速度非常快,每次调用都会检索到相同的时间,因此生成的数字与给定种子的第一个序列数相同。
答案 1 :(得分:2)
将其放入sep_gen
表示每次调用sep_gen
时都会重新启动,而不是每次运行一次。并且time
从纪元开始返回秒数;您的计划可能会在同一秒内全部拨打sep_gen
三次,因此您需要在每次random
来电之前重新接通一个固定的起始点。
基本上,作为一项规则,程序应该只播种一次其随机源,或者如果因任何原因需要重新种植,需要确保它不会使用不会发生变化的种子源。一种非常简单的重新种植方法而不重复自己会像srandom(time(NULL) ^ random());
那样,因此生成器的现有状态会扰乱不充分变化的外部种子源time()
。这只是一个玩具示例(经常与time
不相干而不会对预期的行为做出巨大改变),只是说明如何在更复杂的场景中做这样的事情。