5

我想在matlab中生成一个高斯分布和均匀分布的数字。我知道这个函数 randirand()但它们都处于正态(高斯)分布。如何生成均匀分布的随机数?

4

6 回答 6

14

用于0 和 1 之间rand(dimensions)均匀分布。

用于均值为mu且标准差为sigmarandn(dimensions) * sqrt(sigma) + mu高斯分布

均匀分布

正态分布

于 2012-12-12T17:58:25.787 回答
7

randn是生成高斯分布变量(randirand产生均匀分布的变量)的函数。

于 2012-12-12T17:17:19.453 回答
5

您可以从 rand() 生成任何分布。

例如,假设您想为 rayleigh dist 生成 100000 个样本。这样做的方法是反转该特定函数的 cdf。基本思想是,由于 cdf 必须在 0 和 1 之间,我们可以找到通过输入 cdf b/w 0 和 1 的值来计算随机变量的值。所以对于 rayleigh,它将是

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

您可以为高斯分布做类似的事情。

于 2013-11-19T18:58:34.317 回答
4

恭喜,您已经生成了具有高斯分布的伪随机数。正态分布是它的同义词。

我可以从您的问题中得到的唯一其他可能的解释是,您想要具有均值!= 0 和/或方差!= 1 的东西。要做到这一点,只需执行mean + sqrt(var) * randn(X).

于 2012-12-12T17:16:39.620 回答
3

的确,您几乎可以从中生成任何东西,rand但这并不总是很方便,尤其是对于一些复杂的发行版。

MATLAB 引入了概率分布对象,这使这变得更加容易,并允许您无缝访问meanvartruncatepdfcdficdf(逆变换)median、 和其他函数。

您可以将分布拟合到数据。在这种情况下,我们使用makedist定义概率分布对象。然后我们可以使用random.

% Parameters
mu = 10; 
sigma = 3;
a = 5; b = 15;
N = 5000;

% Older Approaches Still Work
rng(1775)
Z = randn(N,1);    % Standard Normal  Z~N(0,1)
X = mu + Z*sigma;  % X ~ Normal(mu,sigma)

U = rand(N,1);     % U ~ Uniform(0,1)
V = a + (b-a)*U;   % V ~ Uniform(a,b)

% New Approaches Are Convenient
rng(1775)
pdX = makedist('Normal',mu,sigma);
X2 = random(pdX,N,1);

pdV = makedist('Uniform',a,b);
V2 = random(pdV,N,1);

一个可重现的例子:

直方图

Support = (0:0.01:20)';
figure 
s(1) = subplot(2,2,1)
h(1) = histogram(X,'Normalization','pdf')
xlabel('Normal')
s(2) = subplot(2,2,2)
h(2) = histogram(V,'Normalization','pdf')
xlabel('Uniform')
s(3) = subplot(2,2,3), hold on, box on
h(3) = histogram(X2,'Normalization','pdf')
plot(Support,pdf(pdX,Support),'r-','LineWidth',1.2)
xlabel('Normal (new)')
s(4) = subplot(2,2,4), hold on, box on
h(4) = histogram(V2,'Normalization','pdf')
plot(Support,pdf(pdV,Support),'r-','LineWidth',1.2)
xlabel('Uniform (new)')
xlim(s,[0 20])  

参考:
均匀分布
正态(高斯)分布

于 2018-10-20T03:28:27.307 回答
2

按照 raj 的回答:通过使用Box-Muller 变换,您可以生成独立的标准正态/高斯随机数:

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效果更好。

于 2013-11-19T20:04:59.473 回答