2012-12-12 347 views
4

我想在高斯和均勻分佈中使用matlab生成數字。 我知道這個函數randirand()但他們都是正常(高斯)分佈。怎樣才能生成均勻分佈的隨機數字?在matlab中使用高斯和均勻分佈的隨機數

+3

正態分佈*是*高斯分佈。 – jerad

+1

@zhilevan:我是否在最新的答案中閱讀了您的想法? – mmgp

+0

@mmgp,tnx你的注意力,是的,我讀過它 – zhilevan

回答

14

爲0和1

之間的均勻分佈使用randn(dimensions) * sqrt(sigma) + mu用於高斯分佈一個均值和方差西格瑪使用rand(dimensions)

Uniform Distribution

Normal Distribution

+0

'randnrm' **在matlab 2011中不是有效函數** :( – zhilevan

+0

好的,只是在r2011a上更新和測試。 – chriswynnyk

+0

標準偏差和方差是不同的東西,答案目前是錯誤的。這裏有另一個答案是正確的。 – mmgp

3

編輯器,你已經產生了一個高斯分佈的僞隨機數。正態分佈是它的同義詞。

我可以從你的問題得到的唯一其他可能的解釋是,你想要的東西意味着!= 0和/或方差!= 1.要做到這一點,只需執行mean + sqrt(var) * randn(X)即可。

+0

pease爲**生成數字,** **和另一個** gaussin **分佈。 tnx – zhilevan

+2

您需要查看您的書籍或其他來源。你讀過我答案的第一句話了嗎?它們是同義詞,即它們是同一物。 – mmgp

+0

是的,我讀了它,我想要2分佈,1:高斯(普通),2:統一 – zhilevan

7

randn是產生高斯分佈變量(randirand產生均勻分佈的變量)的函數。

+0

不,如果你嘗試在matlab 2011中幫助'randn'看到這個幫助randn RANDN正態分佈的僞隨機數。 R = RANDN(N)返回一個N乘N矩陣,其中包含來自標準正態分佈的 的僞隨機值。 RANDN(M,N)或RANDN([M,N])返回 M乘N矩陣。 RANDN(M,N,P,...)或RANDN([M,N,P,...])返回一個N×P-by -...數組。 RANDN返回一個標量。 RANDN(SIZE(A))返回 與A相同的數組。 注意:大小輸入M,N,P ...應爲非負整數。 負整數被視爲0. – zhilevan

+3

是的。通常意味着「高斯」。正如其他人所說的,你需要rand和randn。 – Pete

+1

@zhilevan:正態分佈也稱爲高斯分佈。 – Jonas

4

您可以生成從蘭特任何分配()。

例如,假設您想要爲rayleigh dist生成100000個樣本。要做到這一點的方法是您反轉該特定函數的cdf。基本思想是由於cdf必須介於0和1之間我們可以通過輸入CDF的值b/W 0和1.找到隨機變量的值,所以對於瑞利,這將是

for i = 1:100000 
    data(i) = (2*sigma^2 *(-(log(1 - rand(1,1)))))^.5; 
end 

你可以做高斯分佈類似的東西。

+0

在一行中:'sigma = 3; tmp =(2 * sigma^2 *( - (log(1-rand(1e6,1)))))。^。5; hist(tmp,100)'。 – randomatlabuser

2

繼Raj的回答:使用箱穆勒變換可以生成獨立的標準正態/高斯隨機數:

N = 1e6; z = sqrt(-2*log(rand(N, 1))) .* cos(2*pi * rand(N, 1)); figure; hist(z, 100) 
N = 1e6; z = sqrt(-2*log(rand(N, 1))) .* sin(2*pi * rand(N, 1)); figure; hist(z, 100) 

如果你想申請的逆變換法,您可以使用反互補誤差函數(erfcinv):

N = 1e6; z = -sqrt(2) * erfcinv(2 * rand(1e6, 1)); figure; hist(z, 100) 

但我希望randn效果更好。