王鹏 董平轩 冉玉梅
关键词:概率论与数理统计;随机数;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);