设为首页 加入收藏

TOP

(Visual C++)游戏开发笔记十七 游戏基础算法(一) 游戏随机系统初步 (一)
2014-11-23 19:42:59 】 浏览:334
Tags:Visual 游戏 开发 笔记 十七 基础 算法 随机 系统 初步

一、随机数发生器rand()函数的用法

函数名: rand

功 能: 随机数发生器

用 法: int rand(void);


所在头文件: stdlib.h


函数说明 :


▲rand()的内部实现是用的线性同余法,它不是真的随机数,因其周期特别长,故在一定的范围里可看成是随机的。

▲这种伪随机数是由小M多项式序列生成的,其中产生每个小序列都有一个初始值,即随机种子。(注意: 小M多项式序列的周期是65535,即每次利用一个随机种子生成的随机数的周期是65535,当你取得65535个随机数后它们又重复出现了。)

▲目前,计算机中用来产生随机数的算法基本上都是“线性同余”法。rand()返回一随机数值的范围在0至RAND_MAX 间。RAND_MAX的范围最少是在32767之间(int)。

▲用unsigned int 双字节是65535,四字节是4294967295的整数范围。0~RAND_MAX每个数字被选中的机率是相同的。

▲用户未设定随机数种子时,系统默认的随机数种子为1。

▲rand( )产生的是伪随机数字,每次执行时是相同的;若要不同,用函数srand()初始化它。


下面我们给出第一个小例子


[cpp]
//MyRand01.cpp
#include
using namespace std;
#include
#include
#define MIN 1 //随机数产生的范围
#define MAX 10

int main()
{
int i;
srand((unsigned)time(0));
cout<<"10个随机数从 "< " 到 "< for(i=0; i<10; i++) //产生随机数
{
cout< }
cout< return 0;
}
//MyRand01.cpp
#include
using namespace std;
#include
#include
#define MIN 1 //随机数产生的范围
#define MAX 10

int main()
{
int i;
srand((unsigned)time(0));
cout<<"10个随机数从 "< " 到 "< for(i=0; i<10; i++) //产生随机数
{
cout< }
cout< return 0;
}

二、初始化随机数发生器srand( )函数的用法


函数名: srand

功 能: 初始化随机数发生器

用 法: void srand(unsigned int seed);

所在头文件: stdlib.h

函数说明:

▲srand()用来设置rand()产生随机数时的随机数种子。


▲参数seed必须是个整数,通常可以利用time(0)的返回值或NULL来当做seed。


▲如果每次seed都设相同值,rand()所产生的随机数值每次就会一样。


下面我们给出第二个小例子


[cpp] view plaincopyprint
//MyRand02.cpp

#include
using namespace std;
#include
#include
#define MIN 0 //随机数产生的范围
#define MAX 99
int main()
{
int i;
srand((unsigned)time(NULL));
cout<<"10个随机数从"< " 到"< for(i=0; i<10; i++) //产生随机数
{
cout< }
cout< return 0;
}
//MyRand02.cpp

#include
using namespace std;
#include
#include
#define MIN 0 //随机数产生的范围
#define MAX 99
int main()
{
int i;
srand((unsigned)time(NULL));
cout<<"10个随机数从"< " 到"< for(i=0; i<10; i++) //产生随机数
{
cout< }
cout< return 0;
}


三、rand( )和srand( )的联系

rand( )和srand( )要一起使用,其中srand( )用来初始化随机数种子,rand( )用来产生随机数。


因为默认情况下随机数种子为1,而相同的随机数种子产生的随机数是一样的,失去了随机性的意义,所以为使每次得到的随机数不一样,用函数srand()初始化随机数种子。srand()的参数,用time函数值(即当前时间),因为两次调用rand()函数的时间通常是不同的,这样就可以保证随机性了

四、产生相同的随机数的原因

计算机的随机数都是由伪随机数,即是由小M多项式序列生成的,其中产生每个小序列都有一个初始值,即随机种子。(注意: 小M多项式序列的周期是65535,即每次利用一个随机种子生成的随机数的周期是65535,当你取得65535个随机数后它们又重复出现了。)


我们知道rand()函数可以用来产生随机数,这里我再 嗦一遍。计算机中一般不能产生绝对随机的随机数。计算机产生随机数的过程,是根据一个数(我们可以称它为种子)为基准以某个递推公式推算出来的一系列数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正的随机数,当计算机正常开机后,这个种子的值是确定的,除非你对系统进行了更改。


下面我们给出第三个小例子

[cpp]
//MyRand03.cpp

#include
using namespace std;
#include
#include
int main()
{
int i;
for (i=0; i<10; i++) //产生10个随机数
{
cout< }
cout< return 0;
}
//MyRand03.cpp

#include
using namespace std;
#include
#include
int main()
{
int i;
for (i=0; i<10; i++) //产生10个随机数
{
cout< }
cout< return 0;
}


每次运行得到相同的随机序列:


41 18467 6334 26500 19169 15724 11478 29358 26962 24464


41 18467 6334 26500 19169 15724 11478 29358 26962 24464


为得到不同的随机数序列,则需改变这个种子的值。方法

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇richedit研究02 ? 大纲 下一篇VC读配置文件

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目