matlab中有兩個基本的(偽)隨機數發生函式,rand
與randn
. 前者產生0和1之間均勻分布的隨機數, 後者產生均值為0, 方差為1的正態分佈的隨機數. 統計工具箱(statistics toolbox)中那些較為複雜的隨機數發生函式通過呼叫它們來實現, 比如均勻分布函式unifrnd
要呼叫rand
, 正態分佈函式normrnd
要呼叫randn
, 等等.
每次啟動matlab時rand
與randn
的初始狀態都會被自動重置, 從而會產生完全相同的偽隨機序列. 這一點可以通過乙個小實驗驗證. 啟動matlab(我使用的版本是version 7.6.0.324 (r2008a)), 輸入命令rand
, 得到0.8147
. 緊接著輸入randn
, 得到-0.4326
. 重啟matlab後再次執行rand
和randn
, 得到的結果與上述結果一樣.
為了得到不同的偽隨機序列, 可以自行重置隨機數發生函式的狀態, 相應的語句是rand(method, s)
和randn(method, s)
. 這裡的兩個引數都需要稍加說明.method
是乙個字串, 用來指明隨機數發生器使用那種演算法.rand
為method
的取值提供三種選擇:'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)))除了
rand
和randn
這兩個基本函式之外, matlab的統計工具箱還提供乙個函式randg
,用來產生規一化的服從gamma分布的隨機數. gamma分布隨機數產生函式gamrnd
和泊松分布隨機數產生函式poissrnd
就需要通過呼叫randg
實現功能. 看一下randg
的幫助文件不難發現, 這個隨機數產生器的狀態是由rand
和randn
二者的狀態共同決定的.
另外, 根據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 ...