先來給大家介紹一下Matlab的統計工具箱:Statistics Toolbox。能廣泛支援統計計算任務。
下面介紹一些基本的隨機數產生函數:
分布類型 |
函數名稱 |
調用格式 |
二項分布 |
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 csk = 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;enddisp('實驗結果: 兩件次品 一正一次 兩件正品')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 艾特號:用於放在函數名前形成函數控制代碼;用於放在目錄名前形成使用者物件類目錄