MATLAB中的隨機數發生函式

2021-06-06 13:10:13 字數 2514 閱讀 5674

matlab中有兩個基本的(偽)隨機數發生函式,randrandn. 前者產生0和1之間均勻分布的隨機數, 後者產生均值為0, 方差為1的正態分佈的隨機數. 統計工具箱(statistics toolbox)中那些較為複雜的隨機數發生函式通過呼叫它們來實現, 比如均勻分布函式unifrnd要呼叫rand, 正態分佈函式normrnd要呼叫randn, 等等.

每次啟動matlab時randrandn的初始狀態都會被自動重置, 從而會產生完全相同的偽隨機序列. 這一點可以通過乙個小實驗驗證. 啟動matlab(我使用的版本是version 7.6.0.324 (r2008a)), 輸入命令rand, 得到0.8147. 緊接著輸入randn, 得到-0.4326. 重啟matlab後再次執行randrandn, 得到的結果與上述結果一樣.

為了得到不同的偽隨機序列, 可以自行重置隨機數發生函式的狀態, 相應的語句是rand(method, s)randn(method, s). 這裡的兩個引數都需要稍加說明.method是乙個字串, 用來指明隨機數發生器使用那種演算法.randmethod的取值提供三種選擇:'twister','state','seed', 其中最新的'twister'方法產生的偽隨機序列重複週期最長, 也是matlab 7.4及更高版本的預設方法.randn中只包括後兩種method, 預設方法是'state'.

另乙個引數s設定所選定方法的狀態. 可以用rand(method)randn(method)檢視method方法當前的狀態(這一命令並不改變隨機數發生函式當前使用的演算法):'seed'方法的狀態是乙個數, 而'state''twister'方法的狀態是乙個陣列. 用來設定狀態的引數s應該是乙個自然數, 它將隨機數發生器所選定的方法的狀態設定為``第s個''可能的狀態. 需要特別指出的是, 無論使用何種方法,s的取值最好限制在0到2^31-1之間. 超出這個範圍時, 不同的s可能對應同乙個狀態. 可以驗證, 所有不小於2^32-1的s所對應的狀態都與s= 2^31-1所對應的狀態相同.s取2^31到2^32-2之間的不同值時對應的狀態可能不一樣, 但這些狀態都已在s取0到2^31-1時出現過.

有時我們希望每次執行得到的偽隨機序列都不一樣, 這樣看起來更像隨機的.rand的幫助文件中給了乙個示例方案:

rand('twister',sum(100*clock))
這一思路是將狀態值設定為時變的.clock函式返回反映當前時間的1x6陣列[年, 月, 日, 時, 分, 秒](注意sum(100*clock)一般不是整數. 這個例子似乎不太合乎規範, 但執行起來沒問題). 但是這一方法效率並不高, 主要原因是總狀態數為2^31, 約等於2.15e9; 而sum(100*clock)的上界僅約為2.1e5, 而且並非小於這個上界的每個值都能取到. 這個帖子

對此進行了詳細分析, 並且給出了乙個效率較高的方法:

rand('twister', fix(mod(1e11*(sum(clock)-2009), 2^31)))
除了randrandn這兩個基本函式之外, matlab的統計工具箱還提供乙個函式randg,用來產生規一化的服從gamma分布的隨機數. gamma分布隨機數產生函式gamrnd和泊松分布隨機數產生函式poissrnd就需要通過呼叫randg實現功能. 看一下randg的幫助文件不難發現, 這個隨機數產生器的狀態是由randrandn二者的狀態共同決定的.

另外, 根據mathworks**上最新的說明文件

, 上述手動設定隨機數產生器狀態的方法已經過時了, 保留這一方式只是為了保證後向相容. 新的方法我還沒試過(原文: for version 7.7, use the default stream as described in the @randstream reference documentation.), 畢竟我的matlab版本才到7.6.

matlab生成隨機數函式

1.matlab 函式rand 產生在區間 0,1 的均勻隨機數,它是平均分布在 0,1 之間。乙個稱為 seed 的值則是用來控制產生隨機數的次數。均勻隨機數函式的語法為 rand n rand m,n 其結果分別產生一矩陣含n n個隨機數和一矩陣含m n的隨機數。注意每次產生隨機數的值都不會一樣...

真隨機數發生

我們希望建造真隨機數組,有兩種方法一種是採集,一種是自造。一 採集法建造真隨機數 這需要有產生隨機數的物理環境,例如環境雜訊,宇宙射線計數等等需要專門的裝置在此就不討論了,利用計算機本身的一些隨機事件,也能採集到真隨機數,但是效率太低,不能快速的得到大量的隨機數,所以不適於應用。二 自造方法 真隨機...

matlab產生隨機數

matlab中生成隨機數主要有三個函式 rand,randn,randi 1,rand 生成均勻分布的偽隨機數。分布在 0 1 之間 主要語法 rand m,n 生成m行n列的均勻分布的偽隨機數 rand m,n,double 生成指定精度的均勻分布的偽隨機數,引數還可以是 single rand ...