11/28/2006

11.4 隨機亂數指令

事件發生的機率雖然可以估計,但是必須由過去發生的事實去統計,並以此預測未來將發生的事件。這種運作的方式在模擬的作業上有實際的困難,故僅能依靠亂數產生器模擬事件之發生。亂數的特性是發生時間或次數均屬隨機性,每次發生的機率均依循其特定的模式,常用者為均勻分佈的亂數型態,每一事件出現之機率是相等的。利用亂數產生之數值可以模擬機械之故障率、顧客來訪的時機、旅客搭機的安排,甚或穀物乾燥中心作業的動線規劃等。

在MATLAB中常用的亂數產生指令為rand,這是個依均勻機率分配出現之原則產生一個或一組在[0, 1]間之亂數,每次呼叫其值均不一樣。這些數值雖有其範圍,但產生之後可以作適當調整,以符合實際所需。所產生之數值可為單一數字,亦可為特定之矩陣,其大小由其後之參數界定之。若僅輸入一個參數(n),其所產生之結果為一nxn之方矩陣;若為(m, n)則得 m x n之矩陣。

例如:


>>rand
ans =
0.9501

>>rand(2,4)
ans =
0.2311 0.4860 0.7621 0.0185
0.6068 0.8913 0.4565 0.8214


除均勻機率分配產生者外,亦可使用randn之指令,其產生之亂數則係依常態分態的型式。例如:

>> randn(5,6)

ans =

0.8956 0.5689 -0.2340 0.6232 0.2379 0.3899
0.7310 -0.2556 0.1184 0.7990 -1.0078 0.0880
0.5779 -0.3775 0.3148 0.9409 -0.7420 -0.6355
0.0403 -0.2959 1.4435 -0.9921 1.0823 -0.5596
0.6771 -1.4751 -0.3510 0.2120 -0.1315 0.4437

利用常態分佈之指令randn可以產生正負值,其值也可能大於一。其他分配所需之亂數產生器可以參考如下之各項指令。注意每項指令之後可能需要相關之參數,讀者可以利用help之輔助指令獲得所需之資訊。

亂數產生器(Random Number Generators)


依據實際之用途,可以有不同之亂數指令可以應用,

均勻分佈亂數rand
常態分佈亂數randn
  常態亂數(Normal (Gaussian))-normrnd.
貝他亂數(Beta)-betarnd.
二項式亂數(Binomial)- binornd.
X's亂數(Chi square)-chi2rnd.
極值亂數(Extreme value)-evrnd.
指數亂數(Exponential)-exprnd.
F亂數(F)-frnd.
伽瑪亂數(Gamma)-gamrnd.
伽瑪亂數( Gamma (unit scale))-randg.
幾何亂數(Geometric)-geornd.
超幾何亂數(Hypergeometric)-hygernd.
反威夏亂數(Inverse Wishart)-iwishrnd.
常態對數亂數(Lognormal)-lognrnd.
多變異亂數(Multivariate normal)-mvnrnd.
多變T亂數( Multivariate t)-mvtrnd.
負二項式亂數(Negative binomial)-nbinrnd .
非中央F亂數(Noncentral F)-ncfrnd .
非中央亂數(Noncentral)-nctrnd.
非中央X's亂數(Noncentral Chi-square)-ncx2rnd.
波義松亂數(Poisson)-poissrnd.
定群樣本亂數(finite population)-randsample .
魏利亂數( Rayleigh )-raylrnd .
T亂數(T)- trnd .
離散均勻亂數( Discrete uniform)-unidrnd .
均勻亂數(Uniform)-unifrnd .
魏伯亂數(Weibull)-wblrnd .
威夏亂數矩陣( Wishart)-wishrnd .

上述諸多指令,可以實際統計上之需要實際選取應用。例如:以亂數的理念,產生一群數字作排例時,可用randperm(n)指令,以產生不同之排列組合:

>> randperm(7)
ans =
1 3 7 6 2 5 4

>> randperm(7)
ans =
7 6 3 5 4 2 1

>> randperm(7)
ans =
4 1 7 2 6 3 5

其結果每次顯示不同組合,均為整數。此指令因此可以模擬擲骰子,若改用randperm(6),則成為每趟擲六次,顯現排列數據。這個指令與rand指令不同,若使用rand則必須先化成整數,然後利用程式進行模擬擲骰之動作,其過程比較複雜。

MATLAB亦提供一示範指令,randtool。此指令可以示範各種型態之分配機率,利用下拉式清單可以選擇所需的分配型式,並直接設定所需之範圍與變異量。其結果以對應之質方圖顯示。

>> randtool


由於不同之分佈,有不同的指令,不容易記清楚。不過,MATLAB提供一個通用的指令,其型式如下:

random('name', a1,a2,m,n)

這個指令則可在name處置放各種指令名稱,其後可依需要再加上對應之參數,其中a1、a2為該函數所需之參數,而最後之[m,n]則為最後之矩陣大小,變成一個相當有彈性的指令,例如:

random('normal',0,1,3,3)

ans =
-0.1867 2.1832 1.0668
0.7258 -0.1364 0.0593
-0.5883 0.1139 -0.0956

其中之'name'名稱可以為 'beta', 'binomial', 'chi-square' 或 'chi2', 'extreme value' 或 'ev', 'exponential', 'f', 'gamma', 'geometric', 'hypergeometric' 或 'hyge', 'lognormal', 'negative binomial' 或 'nbin', 'noncentral f' 或 'ncf', 'noncentral t' 或 'nct', 'noncentral chi-square' 或 'ncx2', 'normal', 'poisson', 'rayleigh', 't', 'discrete uniform' 或 'unid', 'uniform', 'weibull' 或 'wbl'等等。部份字母符合亦可,且大小寫不拘。如此可以免去背記上述指令之苦。