随机函数

来源:互联网 发布:域名top 编辑:程序博客网 时间:2024/05/21 02:53

作为开篇总结学习,写博客的文章,有点小小兴奋得意,呵呵……刚做一个基于短信的课程设计,

其中涉及到了随机函数,思而再三,觉得是应该总结一下。。。

C语言中实现随机函数,主要有这么两个函数:rand()函数 和 random()函数,

其中random() 不是ANSI C 标准的,所以它不能在gcc 、vc等编译器下编译。

首先,对于rand()函数,其函数原型如下:

作用:随机函数发生器

用法:int rand(void);

#include<stdlib.h> 

#define MULTIPLIER 0x015a4e35L 

#define INCREMENT 1 

static long Seed = 1; 

int rand(void) 

Seed = MULTIPLIER*Seed + INCREMENT;

return ((int)(Seed>>16) & 0x7fff); 

//Seed>>16 将seed向右移16位,seed为4字节long型,只取高16位

//& 0x7fff,0x7fff转成2进制是0111111111111111;作用:把整数变为正整数

}

因此,函数int rand( void )返回一个界于0~32767(0x7fff)之间的伪随机数,包括0和32767C预先生成一组随机数

由于rand产生的随机数是从0到rand_max(即32767,而rand_max是一个很大的数,

那么要产生从X~Y的数需要这么做,rand() % (Y - X + 1) +X 。这样就可以产生你想要的任何范围内的随机数了。

另外之所以叫做伪随机数,是因为C预先生成一组随机数,每次调用随机函数时从指针所指向的位置开始取值,

因此使用rand()重复运行程序产生的随机数都是相同的。不过,可通过srand()函数来改变随机数表的指针位置(用seed变量控制)。

srand()函数的原型如下:

作用:初始化随机数发生器 

用法:void srand(unsigned seed); 

源程序: 

#include<stdlib.h> 

#define MULTIPLIER 0x015a4e35L 

#define INCREMENT 1

static long Seed = 1; 

void srand(unsigned seed) 

{ Seed = seed;}

这个函数是给随机数产生一个随机种子(seed),一般用time作种子,因为时间time的值每时每刻都不同,

种子不同,产生的随机数也不同。因此,要想产生不同的随机数,在使用rand之前需要先调用srand 。

最后加上一个例子,产生X~Y之间的随机数:

# include "stdio.h"

# include “” stdlib.h"

# include “time.h” /*需引用的头文件*/

srand((unsigned)time(NULL));//srand()函数产生一个以当前时间开始的随机种子

n=rand()%(Y-X+1)+X; /*n为X~Y之间的随机数*/ 


/*当然也可以自定义开始时间,如

time_t t;

srand((unsigned) time(&t));

*/ 


/*基于毫秒级随机数产生方法:

   #include<windows.h>
   种子设为:srand(unsigned int seed);
   srand(GetTickCount());

*/