MATLAB中常用的幾種隨機數生成函式

hmxz1024發表於2016-11-16

1:rand函式的用法
命令:rand(N),rand(M,N)等
對於rand(N),通過help rand得到的解釋是:R = rand(N) returns an N-by-N matrix containing pseudorandom values drawn from the standard uniform distribution on the open interval(0,1).
即rand(N)是生成一個符合標準均勻分佈的矩陣,其值位於開區間0~1。
由概率論知識可知,當一個序列服從(0,1)區間的標準均勻分佈時,其期望為0.5,方差為1/12(0.08333)。
可以用程式檢驗一下:

a=rand(1,10);
b=rand(1,1000);
c=rand(1,100000);
mean(a)
ans =0.5890
mean(b)
ans =0.4900
mean(c)
ans =0.5000
var(a)
ans =0.0634
var(b)
ans =0.0834
var(c)
ans =0.0833

可見,隨著資料長度的增加,rand函式生成的資料期望越來越接近0.5,方差越來越接近1/12。
若想生成在區間[a,b]服從標準均勻分佈的序列時,可用公式:r=a+(b-a).*rand(M,N),如下例:

%%在區間[10,100]服從標準均勻分佈,其期望為55,方差為90^2/12=675
r=10+90.*rand(1,100000);
mean(r)
ans =54.9954
var(r)
ans =673.8957

2:randi函式的用法
命令:randi(IMAX,N),randi(IMAX,M,N),randi(IMAX,[M,N]),randi([IMIN,IMAX],…)等
對於randi(N),通過help randi得到的解釋是:
R = randi(IMAX,N) returns an N-by-N matrix containing pseudorandom integer values drawn from the discrete uniform distribution on 1:IMAX.
R = randi([IMIN,IMAX],…) returns an array containing integer values drawn from the discrete uniform distribution on IMIN:IMAX
即randi生成1:IMAX或者IMIN:IMAX之間的離散均勻分佈的整數矩陣。如:

r1=randi(10,2,5)%生成資料在1:10之間的2*5矩陣

r1 =

     7     1     3     7     5
     6     6    10     5     1

>> r2=randi([10,100],2,5)%生成資料在10:100之間的2*5矩陣

r2 =

    93    49    51    89    63
    53    95    98    36    18

在進行通訊系統模擬時,可以利用randi來生成0,1位元序列。如msg_bit=randi([0,1],1,length_tran_msg};

3:randn函式的用法
命令:randn(N),randn(M,N)等
對於randn(N),通過help randn得到的解釋是:R = randn(N) returns an N-by-N matrix containing pseudorandom values drawn from the standard normal distribution.
即randn(N)是生成一個符合標準正態分佈的矩陣,其值位於開區間0~1

%生成一組服從(0,1)標準正態分佈的序列
r=randn(1,100000);
>> mean(r)%均值
ans =
   -0.0015
>> var(r)%方差
ans =
    0.9975
hist(r,1000)%將資料分成1000個組並進行繪製

這裡寫圖片描述

4:隨機資料生成控制語句
在早期的MATLAB版本中,用’seed’,’state’,’twister’等命令控制隨機資料的生成,但是這些命令將在未來的版本中被移除。現在用rng語句來代替這些命令,以控制隨機資料的生成。見MATLAB中的updating your random number generator syntax
下面介紹rng的使用:
1)當使用rand,randi,randn語句時,其預設的是每次生成的資料不同(使用不同的隨機數生成種子)

%前後2次呼叫rand(1,5)生成不同的資料
rand(1,5)
ans =
    0.8147    0.9058    0.1270    0.9134    0.6324
rand(1,5)
ans =
    0.0975    0.2785    0.5469    0.9575    0.9649

而如果你想使得隨機數生成命令返回預設狀態,只需在隨機資料生成命令前加上:

rng('default');

即可。

2)如果想使得生成的隨機資料每次都相同,則可以將隨機數生成環境儲存下來

s=rng;%儲存環境
i1=randi(10,1,5)
i1 =
     2     5    10     8    10
rng(s)%呼叫之前的環境,則下次生成相同的資料
i2=randi(10,1,5)
i2 =
     2     5    10     8    10
i3=randi(10,1,5)
i3 =
     7     1     9    10     7
rng(s)
i3=randi(10,1,5)
i3 =
     2     5    10     8    10

3)若想依據當前的時間來生成一個種子,進而生成每次不同的隨機資料,可以用以下命令:

rng('shuffle');
randi(10,1,5)
ans =
     9     7     9     1     4
randi(10,1,5)
ans =
     2     8     3    10     1

相關文章