一.随机数应用原理:计算机的随机数都是伪随机数生成序列,由小M多项式序列生成的,其中产生每个小序列都从一个初始值开始,即随机种子。
(注意: 小M多项式序列周期是65535,即每次利用一个随机种子生成的随机数的周期是65535,当你取得65535个随机数后又会重复出现。)
利用rand()函数可以用来产生随机数,但是这不是真正意义上的随机数,是一个伪随机数,是根据一个数(我们可以称它为种子)为基准以某个递推公式推算出来的一系列数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正的随机数,当计算机正常开机后,这个种子的值是定了的,除非你破坏了系统。
二.随机数数学原理:rand()的内部实现是利用数学线性同余法,需要可自行查找。
三.随机数范围:rand()返回随机数值的范围在0至RAND_MAX 间。RAND_MAX的范围最少是在32767之间(int)。用unsigned int 双字节是65535,四字节是4294967295的整数范围。0~RAND_MAX每个数字被选中的机率是相同的。
四.随机数关键函数介绍:
rand()函数:
1.语言:C++操作
2.功能:随机数发生器
3.头文件: stdlib.h
4.使用事例:
产生0—100随机数 a = (int) ( rand() % 100 )
产生20—100随机数 a = (int) ( rand() % 80)+20
注:int 可换成double ,float型,相应数据也更换即可。
5.随机数重复问题 划重点(敲黑板)
以上事例未设定随机数种子,系统默认的随机数种子为1,rand()产生的是伪随机数字,每次执行时是相同的。若需要每次执行随机数不同,用种子函数srand()初始化。
srand()函数:
1.功能:初始化随机数发生器
2.用法: void srand(unsigned int seed)
3.头文件: stdlib.h
srand()用来设置rand()产生随机数时的随机数种子。
参数seed必须是个整数,如果每次seed都设相同值,rand()所产生的随机数值每次就会一样。
4.习惯用法:使用当前系统时钟作为随机数种子:(需要调用头文件time.h)
srand((unsigned int)(time(NULL))
注意:若需要多轮生成一组随机数,每一轮的时间小于一秒,就会导致生成相同随机数序列,因为系统时间精确到秒。
经尝试,可将随机数种子设为动态整形变量,见下面例子。
五.随机数生成事例:
1.生成10*10随机数,10轮,利用系统时间做随机数种子
#include<iostream>
#include<stdlib.h>
#include<time.h>
using namespace std;
int main()
{
void randomExponential( );
int i ;
for(i=0; i<10; i++)
{
srand((int)time(NULL));
random( );
}
return 0;
}
void random( )
{
int i,j,a[10][10] ;
for(i=0; i<10; i++)
{
for(j=0; j<10; j++)
{
a[i][j] = (int) ( rand() % 100 ) ;
while( a[i][j] == 0 )
{
a[i][j] = (float) ( rand() % 100 );
}
}
cout<<a[i][0]<<'\t'<<a[i][1]<<'\t'<<a[i][2]<<'\t'<<a[i][3]<<'\t'<<a[i][4]<<'\t'<<a[i][5]<<'\t'<<a[i][6]<<'\t'<<a[i][7]<<'\t'<<a[i][8]<<'\t'<<a[i][9] << endl;
}
cout<<"**********************" << endl;
return;
}
运行结果:运行时间 0.023s
1.生成10*10随机数,10轮,利用动态变量做随机数种子
#include<iostream>
#include<stdlib.h>
#include<time.h>
using namespace std;
int main()
{
void randomExponential( );
int i ;
for(i=0; i<10; i++)
{
srand(i);
randomExponential( );
}
return 0;
}
void randomExponential( )
{
int i,j,a[10][10] ;
for(i=0; i<10; i++)
{
for(j=0; j<10; j++)
{
a[i][j] = (int) ( rand() % 100 ) ;
while( a[i][j] == 0 )
{
a[i][j] = (float) ( rand() % 100 );
}
}
cout<<a[i][0]<<'\t'<<a[i][1]<<'\t'<<a[i][2]<<'\t'<<a[i][3]<<'\t'<<a[i][4]<<'\t'<<a[i][5]<<'\t'<<a[i][6]<<'\t'<<a[i][7]<<'\t'<<a[i][8]<<'\t'<<a[i][9] << endl;
}
cout<<"*******************************************************" << endl;
return;
}
运行结果:运行时间 0.019s
注:此文章为本人做项目时涉及到,留作记录,欢迎批评指正。
部分内容摘抄自http://www.cnblogs.com/afarmer/archive/2011/05/01/2033715.html。