srand((unsigned)time(NULL))和rand的区别

来源:互联网 发布:黔南民族师范学院知乎 编辑:程序博客网 时间:2024/04/30 23:37

可以认为rand()在每次被调用的时候,它会查看:
1) 如果用户在此之前调用过srand(seed),给seed指定了一个值,那么它会自动调用
srand(seed)一次来初始化它的起始值。
2) 如果用户在此之前没有调用过srand(seed),它会自动调用srand(1)一次。


1) 如果希望rand()在每次程序运行时产生的值都不一样,必须给srand(seed)中的seed一个变值,这个变值必须在每次程序运行时都不一样(比如到目前为止流逝的时间)。
2) 否则,如果给seed指定的是一个定值,那么每次程序运行时rand()产生的值都会一样,虽然这个值会是[seed, RAND_MAX(0x7fff))之间的一个随机取得的值。
3) 如果在调用rand()之前没有调用过srand(seed),效果将和调用了srand(1)再调用rand()一样(1也是一个定值)。

stdlib.h头文件中有宏#define RAND_MAX 0x7fff 
rand()产生一个0到0x7ffff即0到32767之间的随机数 
rand()/(RAND_MAX+1.0)就等于一个0到1之间的小数了,因为rand()最大是32767最小是0,再除以32768就是一个0到1之间的小数(不能等于1),再乘以10就是一个0到10之间的数了(不等于10).最后再加1,就成了一个求1到10之间随机数的式子了.

srand函数是随机数发生器的初始化函数,原型: 
void srand(unsigned seed); 
它需要提供一个种子,如: 
srand(1); 
直接使用1来初始化种子。
不过常常使用系统时间来初始化,即使用 
time函数来获得系统时间,它的返回值为从 00:00:00 GMT, January 1, 1970 
到现在所持续的秒数,然后将time_t型数据转化为(unsigned)型在传给srand函数,即: 
srand((unsigned) time(&t)); 
还有一个经常用法,不需要定义time_t型t变量,即: 
srand((unsigned) time(NULL)); 
直接传入一个空指针,因为你的程序中往往并不需要经过参数获得的t数据。
srand((int)getpid()); 
使用程序的ID(getpid())来作为初始化种子,在同一个程序中这个种子是固定的 
随机输出十个0-100之间的整数 
#include <stdlib.h> 
#include <stdio.h> 
#include <time.h> 
void main( void ) 

int i,k;
srand( (unsigned)time( NULL ) ); 
for( i = 0; i < 10;i++ ) 

k=rand()%100; 
printf( " k=%d\n", k ); 

}

补充:

srand()放在哪里并不是问题所在,问题在于两次运行srand((unsigned)time(NULL))之间的时间间隔要足够大,要能让( unsigned )time( NULL )反映出不同的数值,这样种子才不同。 

把srand()放在main里,每次运行程序的时候,从程序结束到重新开始运行,至少都是过了几秒了,这时候种子是不同的,所以随机生成的数不一样。 

把srand()放在其它函数里,计算机代码的运行是很快的,在一秒内调用该函数的次数可能都上几十万次了,( unsigned )time( NULL )可能来不及产生不同的数值,种子是相同的,因此随机生成的数都是一样的。


原文地址:http://hi.baidu.com/shismbwb/item/2ca179f45e9dfe40922af23c