matlab中用rng替換rand('seed',sd)、randn('seed',sd)和rand('state',sd)的通俗解釋
1. rand('seed',sd)、randn('seed',sd)和rand('state',sd)中各參數的含義
我們知道,rand和randn都是用來產生偽隨機數的,但是產生偽隨機數的generator(發生器)有多種,而seed、state、twister等就是用來指定不同類型的偽隨機數發生器的,其中seed 指“v4 generator”,state指“v5 generator”,twister指"Mersenne Twister generator"。第二個參數“sd”是“seed”的縮寫,表示發生器的種子點,這個值將作為generator的輸入,用於產生偽隨機數。這里有必要先解釋一下隨機數和偽隨機數的本質區別:隨機數是在某次產生過程中,按照實驗過程中表現的分布概率隨機產生的,其結果是不可預測的,不可重復的;而偽隨機數則是按照一定算法模擬產生的,其結果是確定的,可重復的。當然這里的確定和可重復是指給定相同的初始值,算法模擬將產生相同的輸出。
2. 為什么要用rand('seed',sd)、randn('seed',sd)和rand('state',sd)
在實際應用中,比如檢查程序問題時,為了重現錯誤,我們可能希望產生相同的偽隨機數,這個時候就需要用這些表達式了。正如前面所說的,如果選用相同的generator並設置相同的初始值sd,那么你就可以得到同樣偽隨機數。
舉個例子:
rand('seed',0); %選定generator並設定初始值
a=rand(3,3);
rand('seed',0);%設定同樣的generator和相同的初始值
b=rand(3,3);
a
b
輸出:
a =
0.218959186328090 0.679296405836612 0.519416372067955
0.047044616214486 0.934692895940828 0.830965346112366
0.678864716868319 0.383502077489859 0.034572110527461
b =
0.218959186328090 0.679296405836612 0.519416372067955
0.047044616214486 0.934692895940828 0.830965346112366
0.678864716868319 0.383502077489859 0.034572110527461
對比后你會發現a和b相等。
3. 為什么要用rng替換rand('seed',sd)、randn('seed',sd)和rand('state',sd)
MATLAB官方給出的理由如下:
1)“seed”和“state”等詞對於所對應的generator來說是一種誤導;
2)除了“twister”以外,其他的generator都有問題;
3)這些表達式對於rand和randn采用了不同的generator,沒必要。
所以在新版的MATLAB中已經不推薦這種方法了。
4. 替換的具體方法
下圖是MATLAB給的一個替換的方式,最右邊的才是它推薦的方法。
實際應用中舉例如下(這里只以seed為例,其他的類似):
randn('seed',0);%rng(0);
a=randn(4,3);
randn('seed',0);%rng(0);
b=randn(4,3);
a
b
MATLAB推薦用注釋掉的語句替換對應行的語句。