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

时间:2016-03-25 22:44:23

标签: c random user-defined-functions random-seed

#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()函数中却没有这样做?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

将其放入sep_gen表示每次调用sep_gen时都会重新启动,而不是每次运行一次。并且time从纪元开始返回秒数;您的计划可能会在同一秒内全部拨打sep_gen三次,因此您需要在每次random来电之前重新接通一个固定的起始点。

基本上,作为一项规则,程序应该只播种一次其随机源,或者如果因任何原因需要重新种植,需要确保它不会使用不会发生变化的种子源。一种非常简单的重新种植方法而不重复自己会像srandom(time(NULL) ^ random());那样,因此生成器的现有状态会扰乱不充分变化的外部种子源time()。这只是一个玩具示例(经常与time不相干而不会对预期的行为做出巨大改变),只是说明如何在更复杂的场景中做这样的事情。