(Visual C++)游戏开发笔记十七 游戏基础算法(一) 游戏随机系统初步
一、随机数发生器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 <iostream>
using namespace std;
#include <stdlib.h>
#include <time.h>
#define MIN 1 //随机数产生的范围
#define MAX 10
int main()
{
int i;
srand((unsigned)time(0));
cout<<"10个随机数从 "<<MIN<<
" 到 "<<MAX<<" :\n"<<endl;
for(i=0; i<10; i++) //产生随机数
{
cout<<MIN + (int)MAX * rand() / (RAND_MAX + 1)<<"\t";
}
cout<<endl;
return 0;
}
//MyRand01.cpp
#include <iostream>
using namespace std;
#include <stdlib.h>
#include <time.h>
#define MIN 1 //随机数产生的范围
#define MAX 10
int main()
{
int i;
srand((unsigned)time(0));
cout<<"10个随机数从 "<<MIN<<
" 到 "<<MAX<<" :\n"<<endl;
for(i=0; i<10; i++) //产生随机数
{
cout<<MIN + (int)MAX * rand() / (RAND_MAX + 1)<<"\t";
}
cout<<endl;
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 <iostream>
using namespace std;
#include <stdlib.h>
#include <time.h>
#define MIN 0 //随机数产生的范围
#define MAX 99
int main()
{
int i;
srand((unsigned)time(NULL));
cout<<"10个随机数从"<<MIN<<
" 到"<<MAX<<" :\n"<<endl;
for(i=0; i<10; i++) //产生随机数
{
cout<<MIN + rand() % (MAX + MIN + 1)<<"\t";
}
cout<<endl;
return 0;
}
//MyRand02.cpp
#include <iostream>
using namespace std;
#include <stdlib.h>
#include <time.h>
#define MIN 0 //随机数产生的范围
#define MAX 99
int main()
{
int i;
srand((unsigned)time(NULL));
cout<<"10个随机数从"<<MIN<<
" 到"<<MAX<<" :\n"<<endl;
for(i=0; i<10; i++) //产生随机数
{
cout<<MIN + rand() % (MAX + MIN + 1)<<"\t";
}
cout<<endl;
return 0;
}
三、rand( )和srand( )的联系
rand( )和srand( )要一起使用,其中srand( )用来初始化随机数种子,rand( )用来产生随机数。
因为默认情况下随机数种子为1,而相同的随机数种子产生的随机数是一样的,失去了随机性的意义,所以为使每次得到的随机数不一样,用函数srand()初始化随机数种子。srand()的参数,用time函数值(即当前时间),因为两次调用rand()函数的时间通常是不同的,这样就可以保证随机性了
四、产生相同的随机数的原因
计算机的随机数都是由伪随机数,即是由小M多项式序列生成的,其中产生每个小序列都有一个初始值,即随机种子。(注意: 小M多项式序列的周期是65535,即每次利用一个随机种子生成的随机数的周期是65535,当你取得65535个随机数后它们又重复出现了。)
&nb
补充:软件开发 , Vc ,