我想在matlab中生成一个高斯分布和均匀分布的数字。我知道这个函数 randi
,rand()
但它们都处于正态(高斯)分布。如何生成均匀分布的随机数?
6 回答
用于0 和 1 之间rand(dimensions)
的均匀分布。
用于均值为mu且标准差为sigmarandn(dimensions) * sqrt(sigma) + mu
的高斯分布。
randn
是生成高斯分布变量(randi
并rand
产生均匀分布的变量)的函数。
您可以从 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
您可以为高斯分布做类似的事情。
恭喜,您已经生成了具有高斯分布的伪随机数。正态分布是它的同义词。
我可以从您的问题中得到的唯一其他可能的解释是,您想要具有均值!= 0 和/或方差!= 1 的东西。要做到这一点,只需执行mean + sqrt(var) * randn(X)
.
的确,您几乎可以从中生成任何东西,rand
但这并不总是很方便,尤其是对于一些复杂的发行版。
MATLAB 引入了概率分布对象,这使这变得更加容易,并允许您无缝访问mean
、var
、truncate
、pdf
、cdf
、icdf
(逆变换)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])
按照 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
效果更好。