随机过程试验上机报告,华科

  • 格式:doc
  • 大小:145.00 KB
  • 文档页数:10

随机模拟与实验
上机实验报告
通信0809 潇洒哥
学号
一. 随机模拟的典型步骤:
1、根据问题构建模拟系统
2、仿真系统中各种分布的随机变量
3、运行模拟系统,进行统计测量
4、分析数据,输出结果
二.主要工具
基本工具:C、C++等编程模拟、matlab
网络模拟:OPNET Modeler、NS2:大型网络仿真CASSAP:数字信号处理;SPW:电子系统
三.编译代码
// MyRand.cpp: implementation of the CMyRand class. //
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "random.h"
#include "MyRand.h"
#include "math.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CMyRand::CMyRand()
{
}
CMyRand::~CMyRand()
{
}
void CMyRand::MyRandInit(void)
{
N = 0x7FFFFFFF; //2^31-1
K = 16807; //7^5
seed = 2;
}
/*函数功能,采用线性同余法,根据输入的种子数产生一个伪随机数,如果种子不变,
则将可以重复调用产生一个伪随机序列
实现思路:利用CMyRand类中定义的全局变量:S, K, N, Y。

其中K和N为算法参数,S 用于保存种子数,Y为产生的随机数,第一次调用检查将seed赋值与S获得Y的初值,之后调用选择rand()函数赋值与Y。

*/
unsigned int CMyRand::MyRand(unsigned int seed)
{
if(S != seed)
{
S = seed;
Y = (seed * K) % N;
}
else
{
Y = (Y * K) % N;
if(Y == 0)
Y = rand();
}
return Y;
}
/*函数功能,产生一个在min~max范围内精度为4位小数的平均分布的随机数
实现思路:min和max代表该均匀随机变量的取值范围,精确到小数点后4位。

该参数在randomDlg.cpp中OnAverage ()和OnAverageStat()函数中已经设置,因此只需将该数小数点右移四位强制取整即可获得整数范围内的随机数,采用对(max-min)求余再加上min并将获得的结果缩小10000倍即可。

*/
double CMyRand::AverageRandom(double min,double max)
{
int minInteger = (int)(min*10000); int maxInteger = (int)(max*10000); int randInteger = MyRand(seed); int diffInteger = maxInteger - minInteger; int resultInteger = randInteger % diffInteger + minInteger; return resultInteger/10000.0; }
/*函数功能,在min 到max 范围内产生正态分布的随机数miu,最大概率密度处的随机变量,即产生的随机数中,概率最大的那个sigma
实现思路:设由AverageRandom 函数获得0-1间隔均匀分布随机数U(0,1),i=1,2,…,n ,且相互独立,由中心极限定理可知,当n 较大时
*/
double CMyRand::NormalRandom(double miu, double sigma, double min, double max) { double dResult; dResult = 0; for(int i=0;i<12;i++) dResult += AverageRandom(min,max); dResult = (dResult-6)/(max-min); dResult = dResult*sigma + miu; return dResult; }
/*函数功能,产生指数分布的随机数 实现思路:
1)用AverageRandom 产生均匀分布随机数{ui}; 2)计算指数分布随机数:xi=-ln ui /λ */
double CMyRand::ExpRandom(double lambda, double min, double max) { double dResult = 0.0; while(dResult < 0.01) { dResult = AverageRandom(min,max); } dResult = -1.0*log(dResult) / lambda; return dResult; }
1()~(0,1)()n i i i i U nE U Z N n D U =-=∑
/*函数功能,产生泊松分布的随机数
实现方法:利用递归法
*/
unsigned int CMyRand::PoisonRandom(double lambda, double min, double max) {
unsigned int dResult;
double u = AverageRandom(min,max);
int i = 0;
double p = exp(-1*lambda);
double F = p;
while(u >= F)
{
p = lambda*p/(i+1);
F += p;
i ++;
}
dResult = i;
return dResult;
}
/*函数功能,计算任意分布的随机过程的均值
实现过程:
用for语句调用任意函数加和循环再求平均*/
double CMyRand::Ex(void)
{
int m;
double Ex=0.0;
//添加均值计算代码
for (m=0; m<1000; m++)
{
Ex += NormalRandom(0,1.2, 0,1);
}
return Ex/1000;
}
/*函数功能,计算随机过程的自相关序列
实现过程:
由平稳随机过程数字特征求解的相关原理可得RX(m)=I2e-2λ|m|; */ double* CMyRand::Rx(double lambda, int points)
{
int m,I=5;
double *Rx = (double*)malloc((2*points+1)*sizeof(double));
//添加自相关序列产生代码
//产生的自相关序列存入Rx中,Rx可当作数组使用
//不要在本函数中释放该数组!
for (m=-points; m<=points; m++)
{
Rx[(m+points)] = I * I * exp(-2 * lambda * abs(m));
}
return Rx;
}
四.执行截图
均匀分布
正态分布
正态统计
指数统计
泊松分布
均值(此时取NormalRandom(0,1.2, 0,1))
自相关(此时取int m,I=5;)
五.实验心得
1.该课程设计所设计的各种模块和原理与随机过程的理论知识紧密结合。

所以这样与课本知识关联紧的课程实际比较容易完成,同时不仅加强了对书本基础知识的理解,而且实践环节得到了很好的锻炼,能够激发实践者对随机的兴趣甚至能够自己动手完成一些课题项目。

2.学习使用该软件,可以方便轻松的解决一些复杂编程的问题,可是说是书本知识的具体实际话。

3.课程设计的多样化可以开发思维,鼓励创新,同时也检验了自己对所学知识的牢固性,没有扎实的理论知识基础是不可能有自己的设计方案的,所以我们以后应该学好理论知识,才能创造出我们自己感兴趣的设计和作品。