關於matlab生成隨機數

鴨脖發表於2013-01-27

一,matlab中生成隨機數主要有三個函式:rand, randn,randi

1,rand  生成均勻分佈的偽隨機數。分佈在(0~1)之間

   主要語法:rand(m,n)生成m行n列的均勻分佈的偽隨機數

             rand(m,n,'double')生成指定精度的均勻分佈的偽隨機數,引數還可以是'single'

             rand(RandStream,m,n)利用指定的RandStream(我理解為隨機種子)生成偽隨機數

2,randn 生成標準正態分佈的偽隨機數(均值為0,方差為1)

   主要語法:和上面一樣

3, randi 生成均勻分佈的偽隨機整數

   主要語法:randi(iMax)在開區間(0,iMax)生成均勻分佈的偽隨機整數

             randi(iMax,m,n)在開區間(0,iMax)生成mXn型隨機矩陣

             r = randi([iMin,iMax],m,n)在開區間(iMin,iMax)生成mXn型隨機矩陣

示例驗證:

均值分佈

         概率分佈圖:

            y=rand(1,3000000);
            hist(y,2000);

            關於matlab生成隨機數

         散點圖:

            y=rand(1,3000000);
            plot(y)

            關於matlab生成隨機數

 

 

正態分佈

         概率分佈圖:

           y=randn(1,3000000);
           hist(y,2000);

           關於matlab生成隨機數

 

         散點圖:

           y=randn(1,3000000);
           plot(y);

           關於matlab生成隨機數

二,關於隨機種子,偽隨機數的重複生成

正常情況下每次呼叫相同指令例如rand生成的偽隨機數是不同的,

例如:

rand(1,3)

rand(1,3)

matlab的輸出為:

ans =
   0.139043482536049   0.734007633362635   0.194791464843949
ans =
   0.602204766324215   0.937923745019422   0.149285414707192

如何使兩個語句生成的隨機數相等呢?

Matlab幫助中的下面章節有所敘述:

Managing the Default Stream

管理預設(預設)流

 

rand, randn, and randi draw random numbers from an underlying random number stream, called the default stream. The @RandStream class allows you to get a handle to the default stream and control random number generation.

rand,randn,和randi 從一個基礎的隨機數流中得到隨機數,叫做預設流。你可以通過 @RandStream 類得到預設流的控制程式碼從而控制隨機數的生成。

Get a handle to the default stream as follows:

以下為得到預設流控制程式碼的程式碼:

defaultStream=RandStream.getDefaultStream defaultStream = mt19937ar random stream (current default) Seed: 0 RandnAlg: Ziggurat
Return the properties of the stream object with the get method:
用get方法返回流物件屬性:
get(defaultStream) Type: 'mt19937ar' NumStreams: 1 StreamIndex: 1 Substream: 1 Seed: 0 State: [625x1 uint32] RandnAlg: 'Ziggurat' Antithetic: 0 FullPrecision: 1
The State property is the internal state of the generator. You can save the State ofdefaultStream.
state屬性是發生器的內部狀態,你可以儲存預設流的狀態:
myState=defaultStream.State;
Using myState, you can restore the state of defaultStream and reproduce previous results.
利用myState你可以恢復預設流狀態重新生成前面的結果:
myState=defaultStream.State; A=rand(1,100); defaultStream.State=myState; B=rand(1,100); isequal(A,B) ans = 1
你也可以直接使用@RandStream 類的reset靜態方法重置種子狀態來獲取相同的隨機生成序列,下面是示例程式碼:

stream = RandStream.getDefaultStream;%獲取預設的隨機種子(暫時這麼叫,幫助有詳細解釋)
reset(stream);%重置
rand(stream,1,3)
reset(stream);%重置
rand(stream,1,3)

matlab的輸出為:

ans =
   0.814723686393179   0.905791937075619   0.126986816293506
ans =
   0.814723686393179   0.905791937075619   0.126986816293506

可以看出生成的隨機碼是相等的,這樣可以用於重複實驗上來


轉載於http://blog.sina.com.cn/s/blog_4b94ff130100edwh.html

相關文章