篇一:《随机过程》课程实验报告
一、实验问题
1.编制程序产生并输出100个二项分布的随机数,n?10,p?0.6.
,n?200作图:(在同一直 2.进行三次Poisson过程的模拟,??3,n?50,n?100
角坐标系下,作出‘tn,N(tn)’的关系图
二、问题的分析
Ⅰ随机数的产生:
⑴U(a,b)分布随机数的产生。
⑵非U(a,b)分布随机数的产生。
Ⅱ ⑴X为连续的随机变量,分布函数为F(x)
①R?F(x)~U(0,1)
②设X的密度函数为f(x)
则有R?F(x)??x
??f(t)dt
⑵离散分布随机数的产生
X的分布列为
R~U(0,1)
qi??pi
j?1i
?x,0?R?q1,则有X服从上述分布列. X??1
?xi,qi?1?R?qi
⒈先求出X的分布列,再由上述Ⅱ(2)的方法计算.
⒉由Ⅱ(1)算出X??ln(1?R)
?.
三、程序设计
1.
%该函数用于输出服从所给定的X~b(k,p1)的m个随机数
%e,E分别为所输出随机数的和原先的均值
%v,V分别为所输出随机数的和原先的方差
%p值为给定的X~b(k,p1)的分布列中的概率
function r= bino(m,n,k,p1)
g=0:n;
y=binocdf(g,k,p1)
f(原文来自:wWw.xiaOcAofANweN.coM 小 草 范 文 网:随机过程实验报告)or i=2:(k+1)
p(1)=y(1);
p(i)=y(i)-y(i-1);
end
R=rand(1,m)
for j=1:m
for l=2:k
if 0<R(j)&R(j)<p(1)
x(j)=0;
else if y(l-1)<R(j)&R(j)<y(l)
x(j)=l-1;
end
end
end
end
p
x
e=mean(x)
E=k*p1
v=var(x)
V=k*p1*(1-p1)
end
2.
%该程序用于输出Poisson过程的模拟
%m1,m2,m3为Poisson过程的最终人数,n为Poisson过程的强度
%x,y,z分别m1,m2,m3个人所到达的的时间间隔
%t1,t2,t3分别m1,m2,m3个人所到达的的时刻
%k1,k2,k3检验是否与Poisson过程的强度相近
function g = poisson1(m1,m2,m3,n)
R1=rand(1,m1);
R2=rand(1,m2);
R3=rand(1,m3);
for i=1:m1
x(i)=-(log(1-R1(i)))/n;
end
x
for i=1:m2
y(i)=-(log(1-R2(i)))/n;
end
y
for i=1:m3
z(i)=-(log(1-R3(i)))/n;
end
z
for i=2:m1
t1(1)=x(1);
t1(i)=t1(i-1)+x(i);
end
for i=2:m2
t2(1)=y(1);
t2(i)=t2(i-1)+y(i);
end
for i=2:m3
t3(1)=z(1);
t3(i)=t3(i-1)+z(i);
end
t1
t2
t3
k1=m1/t1(m1)
k2=m2/t2(m2)
k3=m3/t3(m3)
N1=1:m1;
N2=1:m2;
N3=1:m3;
plot(t1,N1,'g.')
hold on
plot(t2,N2,'r.')
hold on
plot(t3,N3,'.')
grid on
xlabel('t')
ylabel('N')
title('Poisson 1y3ì?£?a')
3.
%该程序用于markov链模拟
%R服从U~(0,1),s=[0 1 2 3]
%p为转移概率矩阵A各行的概率累积值,X0,X1,X2,X3分别为从状态空间里的0,1,2,3为初值
function r = markov(A,k)
x=[0 1 2 3];
n=length(A);
R=rand(1,k);
g1=1;
g2=2;
g3=3;
g4=4;
for i=0:(n-1)
for j=2:n
p(i+1,1)=A(i+1,1);
p(i+1,j)=A(i+1,j)+p(i+1,j-1);
end
end
for m=1:k
for j=2:n
if 0<R(m)&R(m)<p(g1,1)
X0(m)=x(1);
else if p(g1,j-1)<R(m)&R(m)<p(g1,j)
X0(m)=x(j);
end
end
end
g1=X0(m)+1 ;
end
for m=1:k
for j=2:n
if 0<R(m)&R(m)<p(g2,1)
X1(m)=x(1);
else if p(g2,j-1)<R(m)&R(m)<p(g2,j)
X1(m)=x(j);
end
end
end
g2=X1(m)+1 ;
end
for m=1:k
for j=2:n
if 0<R(m)&R(m)<p(g3,1)
X2(m)=x(1);
else if p(g3,j-1)<R(m)&R(m)<p(g3,j) X2(m)=x(j);
end
end
end
g3=X2(m)+1 ;
end
for m=1:k
for j=2:n
if 0<R(m)&R(m)<p(g4,1)
X3(m)=x(1);
else if p(g4,j-1)<R(m)&R(m)<p(g4,j)X3(m)=x(j);
end
end
end
g4=X3(m)+1 ;
end
p
R
X=[0 X0]
Y=[1 X1]
Z=[2 X2]
F=[3 X3]
N=0:100;
plot(N,X,'r-')
hold on
plot(N,Y,'m*')
hold on
plot(N,Z,'g+')
hold on
plot(N,F,'b-.')
xlabel('X')
ylabel('N')
title('markov链模拟,状态空间s=[0 1 2 3]')
四、问题求解结果与结论
1.
bino(100,10,10,0.6)
y =
篇二:随机过程实验报告3
实验三
篇三:随机过程试验上机报告,华科
通信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较大时
n U?nE(U) Z?~N(0,1)
*/
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;
}
/*函数功能,产生泊松分布的随机数
实现方法:利用递归法
*/
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;
}