2016-03-25 11 views
-1
#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()函数时,生成的整数三次都是相同的。 (下面的代码)为什么srandom(time(NULL))在main()函数和用户定义的函数中表现不同?

#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被放置在主函数随机()函数生成不同的号码,但不这样做,当在sep_gen()函数?

+0

'srandom'不是标准功能。 – Olaf

+0

@Olaf:根据[手册页](http://linux.die.net/man/3/srandom),它是POSIX.1-2001的一部分。不知道为什么它很重要。 – ShadowRanger

+0

@ShadowRanger:看[问]和[mcve]是什么。有适当的标签用于例如POSIX,否则它应该在文本中。 – Olaf

回答

2

把它放在sep_gen意味着你每次调用sep_gen,不是每个程序运行一次。从历元开始,time正在返回秒;您的计划很可能在同一秒内三次致电sep_gen,因此您需要在每个random呼叫之前重新开始固定的起点。

基本上,一般来说,一个程序应该只播种其随机源一次,或者因为某种原因需要重新播种,需要确保它不使用没有足够改变的种子源。一个非常简单的方法来重新播种而不重复自己会是类似于srandom(time(NULL)^random());,所以发生器的现有状态干扰不充分变化的外部种子源time()。这只是一个玩具的例子(不断地扰动着time并没有对预期的行为做出巨大的改变),只是关于如何在更复杂的情况下做这样的事情。

+0

请你详细说明再播种方法吗?srandom(time(NULL)^ random())''是如何工作的?是指当你说它不会对预期行为做出巨大改变时?道歉,我是初学者,所以我没有遵循那个部分。 –

+0

@ArshithaBasavaraj:它调用'random'从现有流中提取一个值o f随机和按位排除'时间'。所以种子有两个“随机性”来源,不管进入最后一次播种,从那时起随机抽取了多少次(尽管在这种情况下,每次都重新播种),加上“时间”输出。按位xor意味着两个值切换彼此的位,有用地组合。它不会改变行为,因为大部分时间,“随机”流是可预测的;如果你知道程序启动的时间,你可以重现随机流。 – ShadowRanger

2

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

+0

它只被调用一次所以种子没有被重置为相同的值 – greenshade

+0

可以认为它是用0初始化连续整数的序列。如果你初始化它一旦你得到0,1,2,3等等,如果你每次都将它重置为0,你会得到0,0,0 ... – greenshade

+0

当它在主函数中时,它是如何改变的呢? (对不起,我重复了我的问题) –

相关问题