matlab中用rng替換rand('seed',sd)、randn('seed',sd)和rand('state',sd)的通俗解釋


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推薦用注釋掉的語句替換對應行的語句。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM