Let's go!!!!!
分类: LINUX
2012-12-13 15:06:28
rand函数和srand函数:
int rand(void) //产生随机数
函数说明
rand()会返回一随机数值,范围在0至RAND_MAX 间。在调用此函数产生随机数前,必须先利用srand()设好随机数种子,如果未设随机数种子,rand()在调用时会自动设随机数种子为1。关于随机数种子请参考srand()。
返回值
返回0至RAND_MAX之间的随机数值,RAND_MAX定义在stdlib.h,其值为2147483647。
void srand (unsigned int seed) //设置随机数种子
函数说明
srand()用来设置rand()产生随机数时的随机数种子。参数seed必须是个整数,通常可以利用getpid()或time(0)的返回值来当做seed。如果每次seed都设相同值,rand()所产生的随机数值每次就会一样。
范例
/* 产生介于1 到10 间的随机数值/
#include
#include
#include
int main()
{
int i,j;
srand((int)time(0));
for(i=0;i<10;i++)
{
j=1+(int)(10.0*rand()/(RAND_MAX+1.0));
printf("%d ",j);
}
printf("\n");
return 0;
}
执行
5 8 8 8 10 2 10 8 9 9
void srand(unsigned seed) //srand()的实现
#include
#define MULTIPLIER 0x015a4e35L
#define INCREMENT 1
static long Seed = 1;
void srand(unsigned seed)
{
Seed = seed;
}
int rand(void) //rand()的实现
#include
#define MULTIPLIER 0x015a4e35L
#define INCREMENT 1
int rand(void)
{
Seed = MULTIPLIER*Seed + INCREMENT;
return ((int)(Seed>>16) & 0x7fff);
}
从以上两段程序可以看出,简单来说,rand()是通过一个seed变量来产生随机数,而srand()则用于初始化seed变量。
用srand((int)time(0))来初始化seed,然后再后面的代码中采用rand()产生随机数。值得注意的是,其中srand函数使用的参数是由time(NULL)得到的,time()这个函数其实是用来保存一个历史时间,而令其参数为NULL则是相当于清除历史时间保存当前时间,使用当前时间作为初始化seed的参数可以有效地增加随机性(以时间为种子可以利用时间的唯一性,是每次运行程序使用的种子不一样)。
注意:在这个例子中,如果把srand函数放在循环中反而会使随机性变差,因为time()的精确度是秒,而程序运行较快,这样如果每次调用rand函数以前都使用srand(time(NULL))进行初始化,得到的是同一个seed。这样相当于破坏了每次运行rand函数时对seed的改变,每次调用rand函数以前seed被初始化为同一个值了。