《概率论与数理统计》教学中随机数的Matlab实现
作者: 王鹏 董平轩 冉玉梅
关键词:概率论与数理统计;随机数;Matlab;辅助教学;函数
中图分类号:TP311 文献标识码:A
文章编号:1009-3044(2023)02-0138-03
1 引言
众所周知,自然界发生的现象可分为两类。一类现象在一定条件下发生的结果是完全可以预知的,称为必然现象。另一类现象发生的结果事先是无法准确预知的,称为随机现象。《概率论与数理统计》正是讲述随机现象统计规律的课程[1],但是在教学过程中,我们发现纯粹的概念表述和公式推导不利于学生对随机现象的理解,而且计算过程相当繁琐,计算结果也不直观,而引入Matlab作为教学辅助工具则正好能弥补传统教学方式的缺点,能取得更好的教学效果。但是在使用Matlab辅助《概率论与数理统计》教学过程中面临的一个首要问题就是要生成一个随机数,因此有必要对随机数的Matlab实现专门进行系统研究。
2 Matlab简介
Matlab是当今国际很流行的科学计算软件,Mat⁃lab语言是当今国际上最流行的科学与工程计算编程语言[2]。信息技术、计算机技术发展到今天,科学计算在各个领域得到了广泛的应用。在诸多方面例如控制论、系统仿真、数学计算等问题,如果自己去编写程序,不仅会消耗大量的时间,而且往往质量不高。Matlab作为一个专业的数值计算软件,提供了大量的运算函数,可以方便地进行各种复杂的数学计算,而且效率极高,同时具有可视化、编程、GUI和编辑等功能[3],因此极为适宜在《概率论和数理统计》教学中作为辅助工具,它不仅可以快速地调用函数进行概率和统计计算,同时也可以将结果可视化、直观化,极大地促进学生对课程知识的学习和理解。
3 Matlab 中的基本随机数生成函数
Matlab提供了2个基本的生成伪随机数的函数rand 和randn[4],其中rand函数用来生成[0,1]上均匀分布随机数,randn函数用来生成标准正态分布随机数。由[0,1]上均匀分布随机数可以生成其他分布的随机数,由标准正态分布随机数可以生成一般正态分布随机数。在不指明分布的情况下,通常所说的随机数是指[0,1]上均匀分布的随机数。在不同版本的Matlab 中,rand函数有几种通用的调用格式,如下表所示:
其中,输入参数应为正整数,若输入负整数,则被视为0,此时输出一个空矩阵。
下例调用rand函数生成一个4Í4的随机数矩阵和一个1Í10的随机数矩阵,然后再调用hist函数画出对应的频数直方图。
>> x=rand(4)
x =
0.1869 0.7094 0.6551 0.9597
0.4898 0.7547 0.1626 0.3404
0.4456 0.2760 0.1190 0.5853
0.6463 0.6797 0.4984 0.2238
>> y=x(:);
>> x=rand(1,10)
x =
0.1068 0.6538 0.4942 0.7791 0.7150
0.9037 0.8909 0.3342 0.6987 0.1978
>> hist(x)
下例调用randn函数生成一个标准正态分布N(0,1)的1行10列矩阵。
>> x=randn(1,10)
x =
0.0799 -0.9485 0.4115 0.6770 0.8577-0.6912 0.4494 0.1006 0.8261 0.5362
除了以上两个基本随机数函数之外,还可以调用randperm(N)函数,它可以生成一个1,2,...,N的一个随机排列。如下例所示:
>> randperm(6)
ans=
1 4 3 6 2 5
>> randperm(6)
ans=
5 6 4 1 3 2
>> randperm(6)
ans=
2 4 3 6 1 5
rand函数还可以用以下两种方式调用:
1) rand(method,s)
用method确定的随机数生成器生成随机数,此时用s的值初始化随机数生成器的状态。其中输入参数method用来指定随机数生成器所采用的算法,method 是字符串变量,它的可能取值如下表所示:
参数s可以理解为生成随机数序列的初始种子,它的值依赖于所选择的method参数,如果method设定为state或者twister,则s的值必须是一个0到232-1 之间的整数或者rand的输出。若method设定为seed,则s 必须是一个0 到231-2 之间的整数或者rand 的输出。
2)S=rand(method)
它返回method指定的随机数生成器的当前内部状态,并不改变所用的生成器。
需要注意的是,随机数生成器算法及初始状态共同决定了所产生的随机数序列,同样的随机数生成器算法设置为相同的初始状态,则生成相同的随机数。否则会生成不同的随机数,而Matlab每次启动时,都会重置rand函数的状态,所以在改变输入状态值之前,每次与Matlab的会话中rand函数都会生成相同的随机数序列。所以,实际上这个函数生成的是伪随机数[5],其生成机制由随机种子控制。如下例所示:
>> rand‘( twister’,3);
>> y1=rand(1,4)
y1 =
0.5508 0.7081 0.2909 0.5108
>> y2=rand(1,4)
y2 =
0.8929 0.8963 0.1253 0.2072
>> rand‘( twister’,3);
>> y3=rand(1,4)
y3 =
0.5508 0.7081 0.2909 0.5108
>> rand‘( state’,3);
>> y4=rand(1,4)
y4 =
0.5162 0.2252 0.1837 0.2163
0.5162 0.2252 0.1837 0.2163Randn函数做为Matlab两个最基本的随机数生成函数之一,和Rand函数一样,它允许用户自己设置随机种子。若将随机种子设为特定值,同样可以使随机数成为可再现的。而要想得到真正的随机数,则可以将种子设置为系统时间,如rand‘( state’, sum(9*clock)),这样就几乎可以得到真正的随机数。如下例所示:
>> rand‘( state’,sum(9*clock))
>> y5=rand(1,4)
y5 =
0.0068 0.1220 0.2788 0.6099
>> y5=rand(1,4)
y5 =
0.2806 0.8704 0.7339 0.2383
>> rand‘( state’,sum(9*clock))
>> y5=rand(1,4)
y5 =
0.2655 0.4865 0.0341 0.2132
4 一元分布随机数的生成
常见的一元分布随机数可以使用Matlab统计工具箱中以rnd三个字符结尾的函数来生成。如下表所示:
以上这些函数都是直接或者间接调用了rand函数或者randn函数,所以本质上还是属于对两个基本随机数函数的应用。下面是normrnd函数使用的一个例子,调用normrnd函数生成均值为30,标准差为5的600Í2的正态分布随机数矩阵,并作出各列的频数直方图。
>> y=normrnd(30,5,600,2);
>> hist(y)
此外,Matlab通讯系统工具箱还提供了randsrc和randint函数:randsrc函数用来根据指定的分布列生成随机数矩阵,功能类似于randsample函数;randint函数用来生成服从离散均匀分布的随机整数矩阵[6]。
5 多元分布随机数的生成
Matlab中自带的多元分布随机数函数有mnrnd、mvrnd、mvtrnd、iwishrnd 等,前三个调用格式如下表所示:
下面是一个调用的例子:调用mnrnd 函数生成6000组3项分布的随机数,并作出前2列的频数直方图。(其中三项分布参数p=(0.1,0.2,0.7),n=5)
>> n=100;
>> p=[0.1 0.2 0.7];
>> r=mnrnd(n,p,6000);
>> hist3(r(:,1:2),[60,60])
6 结论
经过探讨,使用Matlab生成随机数的基本函数有两个,其他随机数生成函数都是直接或者间接对这两个基本函数的调用。因此在《概率论与数理统计》教学过程中,我们首先要掌握这两个基本函数的用法,同时要理解伪随机数和真正随机数的区别,并分别掌握他们的Matlab实现,这将为《概率论与数理统计》的Matlab辅助教学打下坚实的基础[7-8]。