在實驗數據處理中,經常會有這樣的情況:給定分布類型和參數,生成滿足該分布的隨機數值。如利用蒙特卡羅法估計測量數據的不確定時,就需要使用隨機數生成器來傳遞分布。本書中大量的例子都用到了示例數據,創建這些數據就利用了隨機數生成器。
Igor具有強大的統計分析功能,提供了大量函數和命令,用於分布計算、參數估計、假設檢驗、回歸分析等。其中僅偽隨機數生成器就有12種,可以生成滿足常見分布要求的隨機數,如二項分布隨機數、均勻分布隨機數、高斯分布隨機數、洛倫茲分布隨機數等。在生成隨機數時,可以通過設置隨機數生成種子,生成可重複的隨機數。
本小節主要介紹均勻分布隨機數和高斯分布隨機數生成函數。
1 均勻分布隨機數enoise
enoise(num,[RNG])生成一個滿足均勻分布的隨機數。隨機數分布範圍為[-num,num]。RNG為可選參數,指明enoise函數採用的算法,取1或者2,算法不同,生成的隨機數性能和周期有所差別。
enoise採用的隨機數種子由啟動igor時的系統時鐘值決定,因此生成的隨機數幾乎是完全「隨機」的。如果想要重複的隨機數,可以使用SetRandomSeed設置隨機數種子。
看下面的例子:
make/O/N=10000noisedata=enoise(1)
make/O/N=50 pdis
histogram/B=1 noisedata,pdis
integrate pdis
pdis/=pdis[49]
differentiate pdis
display pdis
ModifyGraph mode=1
結果如圖1所示:
圖1 enoise函數生成隨機數分布
這裡,我們利用enoise函數生成了10000個隨機數,隨機數的範圍被限制到[-1,1]。為了驗證隨機數是否滿足均勻分布,利用Histogram直方統計命令統計隨機數出現的頻率,並且將統計結果放在pdis裡。Pdis長度為50,則histogram會自動將統計區間劃分為50個「箱子」,然後對落在每一個箱子裡的隨機數進行計數。此時pdis裡存放的是隨機數出現的頻率。Integrate命令將pdis轉化為累積頻率分布,然後再除以pdis[49]進行歸一化,此時pdis就是累積概率分布函數。再用different命令求取導數,即為概率密度分布函數,如圖1。
顯然,圖1所示概率密度分布函數值恆定,且大小等於0.5,與期望值(1/(1+1))吻合。
2 高斯分布隨機數生成
gnoise(num,[RNG])生成一個滿足高斯分布的隨機數。隨機數的標準偏差為num。可選參數RNG和enoise相同。高斯分布隨機數由均勻分布隨機數通過Box-Muller算法轉換而來,因此RNG含義完全相同。
下面看一個生成滿足高斯分布的隨機數例子。將上面代碼的enoise換成gnoise,其他的保持不變:
make/O/N=10000noisedata=enoise(1)
make/O/N=50 pdis
histogram/B=1 noisedata,pdis
integrate pdis
pdis/=pdis[49]
differentiate pdis
display pdis
ModifyGraph mode=1
CurveFit/M=2/W=0 gauss,pdis/D
結果如圖2所示:
圖2 滿足高斯分布的隨機數
最後一行利用curvefit命令對pdis進行擬合,擬合函數正是高斯函數。可以看到隨機數的分布函數滿足高斯分布。輸入下面的命令來查看該分布的標準偏差:
Print k3/sqrt(2)
結果為0.997279,與期望值1完全一致。
【本文節選自《Igor Pro使用教程》】