1随机过程随机过程模拟与实验21.随机过程模拟与实验介绍2.随机数产生原理3.实验平台介绍4.实验内容安排随机过程模拟与实验31.随机过程模拟与实验介绍随机模拟的基本方法又称为蒙特卡罗(MonteCarlo)方法。是Velleman与VonNeumann等人在20世纪40年代为研制核武器提出来的,已大量地运用于计算机仿真试验。随机模拟的典型步骤:(1)根据问题构建模拟系统(2)仿真系统中各种分布的随机变量(3)运行模拟系统,进行统计测量(4)分析数据,输出结果4主要工具:基本工具:C、C++等编程模拟、matlab;网络模拟:OPNETModeler、NS2:大型网络仿真CASSAP:数字信号处理;SPW:电子系统5布丰(Buffon)投针试验例子:布丰(Buffon)投针试验将一根长为l的细针随机地投掷于标有无数平行线的平面上,假定平行线间距为2l,则针与平行线相交的概率为1/π。(0,)(0,2){}(/2)sin{}ooDDUUlABlAoπΘΘ=Θ=设落在平面上的细针的中心点为,角度为,与上边平行线的距离为,则与分别服从均匀分布与,且彼此独立。定义事件为针与平行线相交,由下图可知,,则解进入阴影区:lΘBDBB2lO6定义:如果一个实数列{ui}与均匀分布的独立随机变量序列{Ui}的样本序列具有相同的统计特性,则称之为随机样本值,该数列中的各个数称为均匀分布随机数,简称随机数(RandomNumber)。2.随机数产生原理7随机数的产生有三种方法:(1)将已有的随机数存表,需要时直接使用。美国兰德公司在1950年曾将100万个在(0,1)区间内的实数存入计算机外存储器,以便在仿真过程中进行随机调用。(2)将计算机连接到物理设备(如噪声源)上获得随机数流。随机性和均匀性最好,但产生过程太复杂,未能得到推广。(3)通过数学算法产生随机数(伪随机数)。这种方法容易与计算机结合,因而得到广泛的应用。82.1伪随机数的算法伪随机数的产生:用户只需给定一个初始的随机数(种子值),调用该算法,即可按某个固定的公式计算出下一个“随机”数。随后,以新产生出来的“随机”数作为种子,再计算出新的“随机”数。重复调用该算法即可产生出一系列的“随机”数,以满足系统仿真的需要。伪随机数本质上不是随机的。但只要计算公式选择得当,通过比较严格地统计检验,仍然可以产生出一系列近似于U(0,1)分布并且相对独立的随机数流,这种随机数流对于大多数仿真模型,是能满足需要的。因此,仍然是目前广泛应用的工程方法。9(1)产生的随机数序列具有循环周期性。可以证明,任何产生伪随机数的算法总会进入循环,这样为了保证随机数序列不产生重复的数据,就要求循环的周期足够长。(2)算法过程具有再现性:在初始化时,如果赋予相同的种子值,将产生完全相同的随机数序列。伪随机数发生器的特点:10伪随机数是按照一定的计算公式产生的一列数,主要借助于如下的递推公式:un=f(un-1,un-2,…,un-k)该公式(或算法)也称为随机数发生器(RNG)。常用的伪随机数的算法有:(1)平方取中法(VonNeumann40年代发明);(2)乘法取中法;(3)线性同余法:简单、实用;……112.2均匀分布的线性同余法线性同余法(1)设置y0,即设置种子(2)yn=kyn-1(modN),un=yn/N三组常见的参数(1)N=1010,k=7,周期≈5×107(2)(IBM随机数发生器)N=231,k=216+3,周期≈5×108(3)(ran0)N=231-1,k=75,周期≈2×10912大部分计算机语言都提供了产生0-1间隔均匀分布随机数的标准函数或方法:C语言中的rand函数,VB中的randum函数,java语言中的Randnum类,Python语言的random模块。由均匀分布的随机数可构造出任一分布F(x)的随机数,最基本的方法是逆变换法:2.3一般随机数的产生方法1311()()()(),()()()[][()][()]()1()()(0,1)XFxFxUUFxUFxUXFUXFxFxPXxPFUxPuFxfududuFxfuUU−−−∞−∞===≤=≤=≤===∫∫给定分布(假定它是严格单调的),假定由它的反函数对均匀随机变量进行变换,可得:则的分布函数正好是。因为其中,是的均匀随机变量密度函数。14例如:利用变换法产生指数分布随机数的方法。因此,指数分布随机数的模拟方法为:(1)产生均匀分布随机数{ui};(2)计算指数分布随机数:xi=-lnui/λ1()11()ln(1)xFxeXFUUλλλ−−=−==−−参数为的指数分布的分布函数为,其反函数为15从泊松分布的分布律可知,采用前述方法很不适用。由于:{}!iiepPXiiλλ−===11(1)!1iiieppiiλλλ+−+==++因此,采用递推法构成泊松分布:(1)产生均匀分布随机数u;(2)(3)若uF,令X=i,停止;(4)(5)转向(3)。0,,;ipeFpλ−===/(1),,1;ppiFFpiiλ=+=+=+2.4泊松分布随机变量的产生方法162.5正态分布随机变量的产生方法标准正态随机变量的分布函数的反函数不存在显式,因此也不能用逆变法产生。故采用如下方法:设Ui~U(0,1),i=1,2,…,n,且相互独立,由中心极限定理可知,当n较大时2/21()2xtxedtπ−−∞Φ=∫1()~(0,1)()niiiiUnEUZNnDU=−=∑17设Ui~U(0,1),i=1,2,…,n,且相互独立,E(Ui)=1/2,D(Ui)=1/12,当n较大时有:取n=12,近似有:也就是说,只要产生12个伪随机数u1,u2,…u12,将它们加起来,再减去6,就能近似得到标准正态变量的样本值。12~(0,1)112niinUZNn=−=∑1216~(0,1)iiZUN==−∑183.实验平台介绍3.1实验平台包含的源文件3.2MyRand.cpp的函数3.3randomDlg.cpp注意事项19实验平台介绍产生各种分布的随机数统计并显示各种分布的概率密度或分布律显示均值实验自相关序列并显示Rx将显示的结果保存为*.bmp文件波形显示区域20实验执行步骤1.选择执行的实验内容;2.在出现正确结果后,选择“保存”;3.选择结果保存的目录;4.输入保存结果的文件名,必须为*.bmp文件;5.选择“保存”。1245321 StdAfx.cpp:VC工程自带文件,不能修改; random.cpp和random.h:工程主文件,不能修改; Scope.cpp和Scope.h:画图程序,不能修改; randomDlg.cpp和randomDlg.h:主界面程序,包括对各个按钮的动作的响应,还包括对各种随机变量的输入参数的设定; MyRand.cpp和MyRand.h:各种分布的随机变量的产生程序,实验过程中主要完成MyRand.cpp中的函数即可。3.1实验平台包含的源文件223.2MyRand.cpp的函数(1)unsignedintCMyRand::MyRand(unsignedintseed) 函数功能:采用线性同余法,根据输入的种子数产生一个伪随机数,如果种子不变,则可以重复调用该函数产生一个伪随机序列; 参数:seed作为调用函数的输入种子,同一个伪随机数序列可采用同一个seed; 实现思路:利用CMyRand类中定义的全局变量:S,K,N,Y。其中K和N为算法参数,S用于保存种子数,Y为产生的随机数; 注意事项:Y的初值的计算。23(2)doubleCMyRand::AverageRandom(doublemin,doublemax) 函数功能:产生一个在min~max范围内精度为4位小数的平均分布的随机数; 参数:min和max代表该均匀随机变量的取值范围,精确到小数点后4位。该参数在randomDlg.cpp中OnAverage()和OnAverageStat()函数中已经设置。24(3)doubleCMyRand::NormalRandom(doublemiu,doublesigma,doublemin,doublemax) 函数功能:产生均值为miu,方差为sigma的正态分布的随机数; 参数:miu为均值,sigma为方差,min和max为均匀分布随机变量的取值范围。所有参数在randomDlg.cpp的OnNormal()和OnNormalStat()函数中设置; 实现思路:利用中心极限定理,通过多个独立的均匀随机变量之和构成正态随机变量。25(4)doubleCMyRand::ExpRandom(doublelambda,doublemin,doublemax) 函数功能:产生参数为lambda的指数分布的随机数; 参数:lambda为指数分布的参数,min和max为均匀分布随机变量的取值范围,所有参数在randomDlg.cpp的OnExp()和OnExpStat()函数中设置; 实现思路:利用逆变换法。26(5)unsignedintCMyRand::PoisonRandom(doublelambda,doublemin,doublemax) 函数功能:产生参数为lambda的泊松分布的随机数; 参数:lambda为泊松分布的参数,min和max为均匀分布随机变量的取值范围,所有参数在randomDlg.cpp的OnPoison()和OnPoisonStat()函数中设置; 实现思路:利用递归法。27(6)doubleCMyRand::Ex(void) 函数功能:计算任意分布的随机过程的均值。本函数在randomDlg.cpp的OnSelf()函数中调用。28(7)double*CMyRand::Rx(doublelambda,intpoints) 函数功能:计算泊松过程的自相关序列; 参数:lambda为泊松过程的参数,points为输入随机数序列的个数,所有参数在randomDlg.cpp的OnSelfStat()函数中设置; 返回:函数返回一个动态分配的数组头指针,产生的Rx序列保存于该数组中; 注意:不要在本函数中释放该数组的内存。293.3randomDlg.cpp注意事项可以修改本程序中调用的MyRand.cpp中函数的输入参数,以观测参数变化后的效果。但是,不要修改其他与MyRand.cpp无关的代码,以免出现错误!30第一次:伪随机数、均匀随机变量和正态随机变量;第二次:指数随机变量、泊松随机变量、均值和自相关。4.实验内容安排313233(1)随机数的产生34(2)产生一个在min~max范围内精度为4位小数的平均分布的随机数已知随机变量密度函数为:35(4)泊松分布的随机数(3)产生一个指数分布的随机数36实验平台介绍产生各种分布的随机数统计并显示各种分布的概率密度或分布律显示均值实验自相关序列并显示Rx将显示的结果保存为*.bmp文件波形显示区域37实验执行步骤1.选择执行的实验内容;2.在出现正确结果后,选择“保存”;3.选择结果保存的目录;4.输入保存结果的文件名,必须为*.bmp文件;5.选择“保存”。12453