下面介绍一些基本的随机数生成函数:
分布类型 |
函数名称 |
调用格式 |
二项分布 |
binornd |
R = binordn(N,P,mm,n); |
卡方分布 |
chi2rnd |
R = chi2rnd(N,mm,nn) |
指数分布 |
exprnd |
R = exprnd(MU,mm,nn) |
F分布 |
frnd |
R = frnd(M,N,mm,nn) |
正态分布 |
normrnd |
R = normrnd(MU,SIGMA,mm,nn) |
泊松分布 |
poissrnd |
R = poissrnd(LAMBDA,mm,nn) |
学生t分布 |
trnd |
R = trnd(N,mm,nn) |
离散均匀分布 |
unidrnd |
R = unidrnd(N,mm,nn) |
连续均匀分布 |
unifrnd |
R = unifrnd(A,B,mm,nn) |
下面来用Matlab解决一些随机数应用。
栗1:掷两个骰子,出现点数之和有多少中可能的结果?其中哪个结果概率最大?其值为多少?
解:掷骰子所出现的点数服从均匀分布,所以建立一下MATLAB程序:
% 掷两颗骰子出现的点数之和有多少种可能的结果 clear cs k = 30000; %掷骰子的次数 n = 2; %骰子的个数 for m = n:6*n %从2到12遍历 cs(m) = 0; %清零计数器====为何有warning? end %结束循环 for m = 1:k %进行k次投掷实验 s2 = unidrnd(6,1,n);%模拟一次投掷n颗骰子的实验,s2中存储了本次试验的结果,即n个数字 s = sum(s2); %将s2中的数字求和 cs(s) = cs(s)+1; %将求和的结果求出后,在对应的计数器里面加一以记录当前操作 end fprintf('点数\t\t次数\t\t概率\n') for m = n:6*n %显示实验结果 fprintf('%2d\t\t%4d\t%0.4f\n',m,cs(m),cs(m)/k) end
其中函数unidrnd(6,1,n)的功能是从集合{1,2,3,4,5,6}中产生一个1×n阶的随机数矩阵。(讲解一下MATLAB分号的意义)
再举一个使用乘法原理的栗子。
题目的需求是:在100件产品中有3件次品。现在从中连取两次,每次取一件,取后不放回,求下列事件的概率:
(1)两次都是正品
(2)一件正品,一件次品。
分析略过,程序清单:
k = 40000; %实验次数 for n = 1:3 cs(n)=0; %清零计数器 end; for m = 1:k for n = 1:3 cp(n) = 0; %将次品标记为0 end; for n = 4:100 cp(n) = 1; %将正品标记为1 end; q1 = cp(unidrnd(100)); %抽取第一件商品 if q1==0 cp(1)=1; %如果第一次抽到的是次品,则次品减少一个 end q2 = cp(unidrnd(99)); q = q1+q2+1; %若q为0(0+0)则是两件次品,若q为1(1+0或0+1)则是一正一次,若q为2(1+1)则是两件正品 cs(q) = cs(q)+1; end disp('实验结果: 两件次品 一正一次 两件正品') disp(sprintf('对应概率: %7.5f %7.5f %7.5f',cs(1)/k,cs(2)/k,cs(3)/k))
注意,因为模拟的是随机事件,所以每一次模拟的实验结果都是不完全相等的。
将代码存档时需要注意,应尽量符合Matlab的命名规范,否则无法run对应的.m程序。
在这里简单说明一下Matlab中各个标点符号的功能:
1 空格:用于输入变量之间的分隔符以及数组行元素之间的分隔符
2 逗号:用于要显示计算结果的命令之间的分隔符;输入变量之间的分隔符以及数组行元素之间的分隔符。
3 点号:数值中的小数点
4 分号:不显示计算结果的命令行的结尾;用于不显示计算结果的命令之间的分隔符;用于数组元素行之间的分隔符。
5 冒号:生成一维数值数组,表示一维数组的全部元素或多维数组的某一维的全部元素
6 百分号:用于注释的前面
7 单引号:括住字符串
8 圆括号:引用数组元素;用于函数输入变量列表;用于确定算术运算的先后次序
9 方括号:构成向量和矩阵; 用于函数输出列表
10 下划线:用于一个变量、函数和文件名中的连字符
11 续行号:用于把后面的行和该行连接以构成一个较长的命令
12 艾特号:用于放在函数名前形成函数句柄;用于放在目录名前形成用户对象类目录