Chinaunix首页 | 论坛 | 博客
  • 博客访问: 292753
  • 博文数量: 113
  • 博客积分: 446
  • 博客等级: 下士
  • 技术积分: 1229
  • 用 户 组: 普通用户
  • 注册时间: 2012-12-09 16:01
个人简介

Let's go!!!!!

文章分类

全部博文(113)

文章存档

2019年(5)

2018年(4)

2017年(9)

2016年(5)

2015年(39)

2014年(6)

2013年(28)

2012年(17)

分类: LINUX

2012-12-13 15:06:28

rand函数和srand函数:

int rand(void)            //产生随机数

函数说明
rand()
会返回一随机数值,范围在0RAND_MAX 间。在调用此函数产生随机数前,必须先利用srand()设好随机数种子,如果未设随机数种子,rand()在调用时会自动设随机数种子为1。关于随机数种子请参考srand()

返回值
返回0RAND_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函数使用的参数是由timeNULL)得到的,time()这个函数其实是用来保存一个历史时间,而令其参数为NULL则是相当于清除历史时间保存当前时间,使用当前时间作为初始化seed的参数可以有效地增加随机性(以时间为种子可以利用时间的唯一性,是每次运行程序使用的种子不一样)。

注意:在这个例子中,如果把srand函数放在循环中反而会使随机性变差,因为time()的精确度是秒,而程序运行较快,这样如果每次调用rand函数以前都使用srandtimeNULL))进行初始化,得到的是同一个seed。这样相当于破坏了每次运行rand函数时对seed的改变,每次调用rand函数以前seed被初始化为同一个值了。

 


阅读(390) | 评论(0) | 转发(0) |
0

上一篇:linux pwrite() pread()

下一篇:linux 信号量

给主人留下些什么吧!~~