目录
一. 写在前面
二. MATLAB代码
三. 例题
三. 补充
3.1 伪随机数
3.2 蒙特卡洛仿真法
本篇文章涉及到的分布,分布,T分布,F分布,Rayleigh分布,大家可以看这篇博客:
基于MATLAB的卡方分布,瑞利分布,T与F分布(附完整代码与例题)-CSDN博客
在MATLAB中,rand命令:产生0~1之间均匀分布的随机数。但是,rand命令真的能生成随机数吗?
我们知道计算机是确定性的机器, 只能生成伪随机数! 即使访问外部时钟, 也只是避免每次生成出相同的序列。
其实,随机序列是一个模糊的说法,一般我们要求其中每一项对于外界都是不可预测的,并且这些数字通过了一定数量的统计学传统测试。
所以计算机界,密码学界都有一个开放性的问题:如何生成一个看似随机的数的序列? (同时计算量要小)。
生成n行m列的分布的伪随机数矩阵,MATLAB代码:
A=gamrnd(a,lambda,n,m)
生成n行m列的分布的伪随机数矩阵,MATLAB代码:
B=chi2rnd(k,n,m)
生成n行m列的T分布的伪随机数矩阵,MATLAB代码:
C=trnd(k,n,m)
生成n行m列的F分布的伪随机数矩阵,MATLAB代码:
D=frnd(p,q,n,m)
生成n行m列的Rayleigh分布的伪随机数矩阵,MATLAB代码:
E=raylrnd(b,n,m)
令b=1,生成个Rayleigh分布的随机数,并用直方图检验生成数据的概率分布情况。
解:
题目的本质是生成一个列向量,维度为3000,服从Rayleigh分布。
MATLAB代码:
b=1; %瑞利分布的参数
p=raylrnd(1,30000,1); %我们想要的列向量
xx=0:.1:4; %0~4,间隔为0.1
yy=hist(p,xx);
% hist()找出随机数落入各个子区间的点个数,并由之拟合出生成数据的概率密度。
yy=yy/(30000*0.1); %近似概率密度
bar(xx,yy), %画直方图
y=raylpdf(xx,1); %求瑞利分布的概率密度
line(xx,y) %将瑞利分布连成曲线
运行结果:
分布:直方图的结果与瑞利分布类似。
自然界中的很多现象, 例如抛掷硬币、抛掷骰子、转轮、洗牌等都展示出随机性, 我们可以利用这些现象产生一些短周期的随机数. 利用计算机中的某些事件, 如定时中断或时钟等也可以产生随机数, 但这种机械方法由于计算机硬件故障经常会使随机数偏斜, 并且这些数没法重复产生.
1946年, 冯.诺依曼首次给出了使用计算机程序产生随机数的方法, 但事实证明这种方法产生的数也并非是随机的.一个普遍的观点是, 绝对随机的随机数只是一种理想的随机数, 计算机不会产生绝对随机的随机数, 它只能生成相对随机的随机数, 即伪随机数. 因此, 伪随机数并不是假随机数, 这里的“伪”是有规律的意思, 就是产生的伪随机数既是随机的又是有规律的. 这样产生的数列虽然不是由真实的随机现象产生的, 但具有类似于随机数的统计性质, 可以作为随机数来使用.
已有通用伪随机数生成程序不足之处:
以下算法都要用到伪随机数:
最后补充伪随机经常出现的“蒙特卡洛“。
蒙特卡洛方法是一类依靠重复随机采样来获得数值结果的计算方法的统称. 它们的核心思想是利用随机性来求解原则上可能是确定性的问题. 理论上, 蒙特卡洛方法可以用于求解任何在统计意义 下可解释的问题. 蒙特卡洛方法的理论基础是大数定律.
大数定律(law of large numbers)是一种描述当试验次 数很大时所呈现的概率性质的定律. 大数定律通俗一点来讲, 就是样本数量很大的时候, 样本均值和真实均值充分接近.
蒙特卡洛方法通常包括以下几个步骤:
① 定义输入数据的范围
② 在指定范围内生成满足一定概率分布的随机输入数据
③ 对输入数据进行确定性计算
④ 合成计算得出结果
举个例子:用蒙特卡洛方法计算
第一步:给定一个的正方形,画出其内切圆;
第二步:在正方形内随机均匀绘制散点;
第三步:统计正方形内的散点总数和内切圆内的散点数量;
第四步:计算。
根据比例可得:
由此可得:
如下图为计算机的仿真结果:
通过讨论我们知道,以上图形中的散点要求在正方形内随机且均匀的分布。直观上,散点数量必须足够多,才可以反应出这种比例关系。简单来讲,就是若只有少量散点, 近似效果差; 散点数量越多, 近似效果越好。