基于MATLAB的伪随机数(附完整代码与例题)

目录

一. 写在前面

二. MATLAB代码

三. 例题

三. 补充

3.1 伪随机数

3.2 蒙特卡洛仿真法


一. 写在前面

本篇文章涉及到的\Gamma分布,\mathcal{X}^2分布,T分布,F分布,Rayleigh分布,大家可以看这篇博客:

基于MATLAB的卡方分布,瑞利分布,T与F分布(附完整代码与例题)-CSDN博客

在MATLAB中,rand命令:产生0~1之间均匀分布的随机数。但是,rand命令真的能生成随机数吗?

我们知道计算机是确定性的机器, 只能生成伪随机数! 即使访问外部时钟, 也只是避免每次生成出相同的序列。

其实,随机序列是一个模糊的说法,一般我们要求其中每一项对于外界都是不可预测的,并且这些数字通过了一定数量的统计学传统测试。

所以计算机界,密码学界都有一个开放性的问题:如何生成一个看似随机的数的序列? (同时计算量要小)。

二. MATLAB代码

生成n行m列的\Gamma分布的伪随机数矩阵,MATLAB代码:

A=gamrnd(a,lambda,n,m)

生成n行m列的\mathcal{X}^2分布的伪随机数矩阵,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,生成3000\times 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) %将瑞利分布连成曲线

运行结果:

基于MATLAB的伪随机数(附完整代码与例题)_第1张图片

分布:直方图的结果与瑞利分布类似。

三. 补充

3.1 伪随机数

自然界中的很多现象, 例如抛掷硬币、抛掷骰子、转轮、洗牌等都展示出随机性, 我们可以利用这些现象产生一些短周期的随机数. 利用计算机中的某些事件, 如定时中断或时钟等也可以产生随机数, 但这种机械方法由于计算机硬件故障经常会使随机数偏斜, 并且这些数没法重复产生.

1946年, 冯.诺依曼首次给出了使用计算机程序产生随机数的方法, 但事实证明这种方法产生的数也并非是随机的.一个普遍的观点是, 绝对随机的随机数只是一种理想的随机数, 计算机不会产生绝对随机的随机数, 它只能生成相对随机的随机数, 即伪随机数. 因此, 伪随机数并不是假随机数, 这里的“伪”是有规律的意思, 就是产生的伪随机数既是随机的又是有规律的. 这样产生的数列虽然不是由真实的随机现象产生的, 但具有类似于随机数的统计性质, 可以作为随机数来使用.

基于MATLAB的伪随机数(附完整代码与例题)_第2张图片

已有通用伪随机数生成程序不足之处: 

  • 随机序列的长度和随机数的字长固定, 而自编程序可以自由控制
  • 在重复计算中, 不如自编的程序容易控制

以下算法都要用到伪随机数:

  1. 遗传算法: 随机产生初始种群, 轮转法选择个体, 随机选择交叉点, 随机选择变异的基因
  2. 禁忌搜索算法: 随机选择初始解和多阶段禁忌搜索初始解
  3. 模拟退火算法: 随机选择邻域解, 按概率作转移决策
  4. 蚁群算法: 随机产生初始蚁群, 按概率选择路径
  5. 粒子群优化算法: 随机初始化, 移动方向的随机加权组合
  6. 捕食搜索算法: 随机初始化, 在限制区域内的随机搜索
  7.  人工神经网络算法: 随机初始化, 随机梯度下降
  8. 动态进化计算、算法性能测试……

3.2 蒙特卡洛仿真法

最后补充伪随机经常出现的“蒙特卡洛“。

蒙特卡洛方法是一类依靠重复随机采样来获得数值结果的计算方法的统称. 它们的核心思想是利用随机性来求解原则上可能是确定性的问题. 理论上, 蒙特卡洛方法可以用于求解任何在统计意义 下可解释的问题. 蒙特卡洛方法的理论基础是大数定律.

大数定律(law of large numbers)是一种描述当试验次 数很大时所呈现的概率性质的定律. 大数定律通俗一点来讲, 就是样本数量很大的时候, 样本均值和真实均值充分接近.

蒙特卡洛方法通常包括以下几个步骤:

① 定义输入数据的范围

② 在指定范围内生成满足一定概率分布的随机输入数据

③ 对输入数据进行确定性计算

④ 合成计算得出结果

举个例子:用蒙特卡洛方法计算\pi

第一步:给定一个2\times 2的正方形,画出其内切圆;

第二步:在正方形内随机均匀绘制散点;

第三步:统计正方形内的散点总数N_s和内切圆内的散点数量N_c

第四步:计算。

根据比例可得:

\frac{N_c}{N_s}=\frac{\pi}{4}

由此可得:

\pi=4\frac{N_c}{N_s}

如下图为计算机的仿真结果:

基于MATLAB的伪随机数(附完整代码与例题)_第3张图片

通过讨论我们知道,以上图形中的散点要求在正方形内随机且均匀的分布。直观上,散点数量必须足够多,才可以反应出这种比例关系。简单来讲,就是若只有少量散点, 近似效果差; 散点数量越多, 近似效果越好。

你可能感兴趣的:(MATLAB,matlab,算法,开发语言,概率论,数学建模,计算机网络)