MATLAB中常用的幾種隨機數生成函式
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