MATLAB中rand,randi,randn函数,及rand('state',0)和rand('seed',0)产生随机种子详解
一、問題來源:
? ? ? ? ? ? ?在學習matlab中看到書上有許多關于生成隨機數的應用,y書上一開始會寫一個rand('state',0),注釋是為了方便驗證,一開始并不是很理解,最近搜索網上文章等深入理解了下關于MATLAB中生成隨機數函數的相關應用。
二、問題探究
1:rand(....)
? ? ? ? 它是生成(0,1)之間(開環,不包含0和1兩個數)均勻分布的偽隨機數,也就是無窮次試驗其中產生的概率是一樣。
R = rand? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?%返回一個在區間(0,1)內均勻分布的隨機數
R = rand(N)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? %生成NxN的矩陣隨機數,其中每個元素位于0~1之間
R = rand(M,N,P,......)? ? ? ? ? ? ? ? ? %生成一個MxNxPx........的矩陣隨機數
R = rand([M,N,P.....])? ? ? ? ? ? ? ? ? %同上,中括號不是必須的,例如:rand([3,4])返回一個3x4的矩陣
R = rand(......,CLASSNAME)?? %生成CLASSNAME類型的隨機數,如‘double’? or? ‘single’類型
?示例:
(1):由隨機數組成的矩陣
>>R = rand(5) %生成一個由介于 0 和 1 之間的均勻分布的隨機數組成的 5×5 矩陣。R =0.8147 0.0975 0.1576 0.1419 0.65570.9058 0.2785 0.9706 0.4218 0.03570.1270 0.5469 0.9572 0.9157 0.84910.9134 0.9575 0.4854 0.7922 0.93400.6324 0.9649 0.8003 0.9595 0.6787>> R = rand(5,3,'double') %生成double類型的5x3均勻分布的0到1間隨機數R =0.7577 0.7060 0.82350.7431 0.0318 0.69480.3922 0.2769 0.31710.6555 0.0462 0.95020.1712 0.0971 0.0344(2):指定區域內的隨機數
? ? ?一般來說,可以使用公式?r = a + (b-a).*rand(N,1)?生成區間 (a,b) 內的?N?個隨機數。
>> r = -5 + (5+5)*rand(10,1) %生成一個由區間 (-5,5) 內均勻分布的數字組成的 10×1 列向量。r =-0.6126-1.18442.65522.9520-3.1313-0.1024-0.54411.46312.09362.5469(3):隨機復數
>> a = rand + 1i*rand %生成一個實部和虛部位于區間 (0,1) 內的隨機復數。a =0.7513 + 0.2551i2:randi(......)
randi(N) 是生成(0,N]間均勻分布的偽隨機數,并且數都是整數,所以每個數是位于1到N之間。它的表達形式有以下幾種:
R = randi(iMax) ? ? ? ? ? ?% 生成1:iMax之間的均勻分布隨機數
R = randi(iMax,m,n) ? ? ? ?% 生成m×n的1:iMax之間的均勻分布隨機數
R = randi([iMin,iMax],m,n) % 生成m×n的iMin:iMax之間的均勻分布隨機數
例如:
R1 = randi(10,5,1); ? ? ?% 生成5×1的1:10之間隨機整數
R2 = randi([10,20],2,3); % 生成2×3的10:20之間隨機整數
3:randn(...)
有時候我們希望生成的隨機數是呈現正態分布的,而不是隨機分布,這時候我們就需要使用randn函數了。它生成的隨機數整體概率為正態分布,均值為0,方差為1。也就是說生成的數中出現0的概率最大,而越往無窮或者負無窮概率越小,但是出現的隨機數可能為所有實數,只不過出現的概率不同。它的格式如下:
R = randn(N) ? % 生成N×N個正態分布的隨機數
R = randn(M,N) % 生成M×N個正態分布的隨機數
例如:
R = randi(3); ? ? ?% 生成3×3的正態分布的隨機數
4:關于rand(‘state’,sum(clock))于rng用法的探究
首先需要知道Matlab中的rand()函數產生的是偽隨機數。如果我們知道偽隨機數的初始狀態,那么產生的偽隨機數是唯一確定的。問題來了,Matlab每次啟動會重置rand()和randn()的初始狀態(重置為0),也就是說,你產生的隨機數會出現兩次隨機數一模一樣的情況,如:
>> rand('state',0) >> rand(3,1)ans =0.95010.23110.6068>> rand('state',1) >> rand(3,1)ans =0.95280.70410.9539>> rand('state',0) %隨機數結果復現了 >> rand(3,1)ans =0.95010.23110.6068個人理解這樣做是為了使得隨機產生的結果重新復現方便多次展示,但是在matlab官網上面說最好不要用這種方法應為在2012以后的版本提供了更好的函數rng,如下圖:(強烈建議有什么問題還是去官網查手冊詳細,有各種例子,而且是官方解釋:https://ww2.mathworks.cn/help/matlab/ref/rand.html?searchHighlight=rand&s_tid=doc_srchtitle)
RandStream - 隨機數流
? ? MATLAB 中的偽隨機數來自一個或多個隨機數流。生成隨機數數組的最簡單方法是使用 rand、randn 或
? ? randi。這些函數全部都依賴于同一均勻隨機數流,稱為全局流。您可以創建與全局流分開使用的其他流,使用它們的 rand、randi 或? ? ? ? ? randn方法生成隨機數數組。您也可以創建隨機數流并將其用作全局流。
?
4、穩定的重啟分布rng?
這里我們來看一下如何讓每次程序運行生成的隨機數都一樣,主要借助的是rang函數,格式如下:
rng('default');
R = rand(1,5); % 每次程序運行生成恒定的1×5隨機數
此外還有生成同樣分布的表達方式:
s = rng;
R1 = rand(1,5);
rng(s);
R2 = rand(1,5); % R1和R2隨機數一樣
?
?
參考文章:
1:https://blog.csdn.net/linhd1102/article/details/51193812
2:https://ww2.mathworks.cn/help/matlab/ref/randi.html?searchHighlight=randi&s_tid=doc_srchtitle
3:https://blog.csdn.net/FX677588/article/details/72811673
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的MATLAB中rand,randi,randn函数,及rand('state',0)和rand('seed',0)产生随机种子详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: arp欺骗攻击——获取内网中用户浏览的图
- 下一篇: 频域与复频域的关系