随机实验报告
班级:通信1301班姓名:郭世康
学号:U201313639 指导教师:卢正新
一、模块功能描述
CMYRand类是整个系统的核心,它产生各种随机数据供后面的类使用。可以产生伪随机序列、均匀分布、正态分布、泊松分布、指数分布等多种随机数据。
CRandomDlg类是数据的采集处理类。它可以将CMYRand产生的随机数据处理分析,再送入CScope等类进行模拟示波器显示。
CScope等类是有关示波器显示的类。
二、模块间的关系
CRandomDlg类在整个程序中是一个不可缺少的环节,它调用CMYRand中的函数来产生符合所需分布的随机序列,再将产生的结果统计分析,送到CScope类中的函数进行模拟示波器显示。CMYRand为整个程序的核心,就是这个类产生所需分布的随机序列。CAboutDlg是模拟示波器界面上的有关按钮选项的类。我们在示波器界面上点击一个按钮,它就会执行这个按钮所对应功能,比如点击正态分布,它就会调用CRandomDlg中的对应函数,在调用CMYRand中的产生正态分布的函数,再将结果送到CScope类中进行显示,最后我们可以在示波器上看到图形。
三、数据结构
在本次随机试验中所填写的代码部分并没有用到有关于结构体等数据结构的东西。
四、功能函数
1、
/*
函数功能,采用线性同余法,根据输入的种子数产生一个伪随机数.
如果种子不变,则将可以重复调用产生一个伪随机序列。
利用CMyRand类中定义的全局变量:S, K, N, Y。
其中K和N为算法参数,S用于保存种子数,Y为产生的随机数
*/
unsigned int CMyRand::MyRand(unsigned int seed)
{
//添加伪随机数产生代码
if(S==seed)
Y=K*Y%N;
else
{
S=seed;
Y=K*seed%N;
}
return Y;
}
输入参数为seed,即种子。输出参数为y,即一个随机序列,它的取值在0到N之间。流程图:
2、
/*函数功能,产生一个在min~max内精度为4位小数的平均分布的随机数*/
double CMyRand::AverageRandom(double min,double max)
{
double dResult;
dResult = 0;
dResult=(double)MyRand(seed)/N;//产生0~1之间的均匀分布
dResult=dResult*(max-min)+min;//将0~1之间的均匀分布通过乘以倍数放大到到min~max
return dResult;
}
输入参数为min,max,即均匀分布的范围。输出参数为dResult,即为随机序列。
流程图:
3、
/*函数功能,根据大数定律,在min 到max 范围内产生正态分布的随机数
Miu为均值,sigma为标准差
*/
double CMyRand::NormalRandom(double miu, double sigma, double min, double max)
{
double dResult;
dResult = 0;
int i,n;
double sum=0.0;
n=200;
for(i=0;i sum+=AverageRandom(min,max);//将均匀分布的随机数据进行求和,即大数定律的应用。 dResult=(sum-n*0.5)/sqrt(n/12); dResult=dResult*sigma+miu; //添加正态分布随机变量产生代码 return dResult; } 输入参数miu,sigma,即为正态分布的均值和标准差,还有min和max,即为均匀分布随机数据的范围。输出参数为dResult,即为得到的正态分布随机变量。 流程图: 4、/*函数功能,产生指数分布的随机数,参数为lambda */ double CMyRand::ExpRandom(double lambda, double min, double max) { double dResult = 0.0; //添加指数分布随机变量产生代码 dResult=-1*log(AverageRandom(min,max))/lambda; return dResult; } 输入参数为指数分布的参数lambda和均匀分布随机序列的范围min、max,输出参数dResult为得到的指数分布随机序列。 流程图: 5、/*函数功能,产生泊松分布的样本数据 */ unsigned int CMyRand::PoisonRandom(double lambda, double min, double max) { unsigned int dResult = 0; //添加泊松分布随机变量产生代码 int i=0; double p,F; p=exp(-lambda); F=p; while(1) { if(AverageRandom(min,max) break; else { p=lambda*p/(lambda+1); F=F+p; i++; } } dResult=i; return dResult; } 输入参数为lambda,即为泊松分布的参数,还有均匀分布随机序列的范围min、max。输出参数为dResult,即为服从泊松分布的随机数据样本。 流程图: 6、/*函数功能,计算任意分布的随机过程的均值 double CMyRand::Ex(void) { double Ex = 0; //添加均值计算代码 int i; double sum=0; for(i=0;i<500;i++) sum+=AverageRandom(0,2); Ex=sum/i; return Ex; } 输出参数为任意随机分布的均值。 流程图: 7、 /*函数功能,计算随机过程的自相关序列 */ double* CMyRand::Rx(double lambda, int points) { int m,I; double *Rx = (double*)malloc((2*points+1)*sizeof(double)); //添加自相关序列产生代码 //产生的自相关序列存入Rx中,Rx可当作数组使用 //不要在本函数中释放该数组! I=5; int j=0; for(j=0,m=-1*points;m<=points;j++,m++) *(Rx+j)=I*I*exp(-2*lambda*abs(m)); return Rx; } 输入变量lambda即为泊松分布的参数,points为所要计算的点数,即为自相关函数中自变量的取值范围。 输出参量RX为指向自相关函数一系列函数值的指针。 流程图: 五、实验小结 通过本次实验,深入了解了C语言中图形界面和整个大的系统程序的写法,对各种随机过程的特征以及产生方法和彼此之间的联系有了更深入一层的认识,在这次试验中也同样遇到了许多问题,比如刚开死的时候看不懂程序中的代码,还有有的函数代码不会写,但是通过我的努力下克服了这些困难,我相信这对我也是一种宝贵的经历。