随机函数
来源:互联网 发布:域名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());*/
- 随机函数
- 随机函数
- 随机函数
- 随机函数
- 随机函数
- 随机函数
- 随机函数
- 随机函数
- 随机函数
- 随机函数
- 随机函数
- 随机函数
- 随机函数
- 随机函数
- 随机函数
- 随机函数
- 随机文件与随机函数
- 随机函数的伪随机
- Vim配置
- PHP学习之一:PHP脚本、类型和变量
- UVa10026 - Shoemaker's Problem
- VC++图形平移功能的实现
- REST架构之Apache Wink介绍
- 随机函数
- PHP提取emule下载ed2k链接
- 地图符号化-柱状图
- 黑马程序员——Java的基本构成元素
- Perl 引用变量传入函数中的行为
- C#调用C/C++ 动态链接库DLL(三)
- 检测两个整数相乘是否会产生溢出
- sizeof(五)
- JAVA中this用法