我想在matlab中生成高斯和均匀分布的数字。
我知道这个函数randi
和rand()
,但它们都是正态(高斯)分布。如何在均匀分布中生成随机数?
答案 0 :(得分:14)
使用rand(dimensions)
获取0到1之间的统一分布。
使用randn(dimensions) * sqrt(sigma) + mu
进行高斯分布,其平均值为 mu ,方差为 sigma 。
答案 1 :(得分:7)
randn
是生成高斯分布式变量的函数(randi
和rand
生成均匀分布的变量)。
答案 2 :(得分: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
你可以为高斯分布做类似的事情。
答案 3 :(得分:3)
一致,您已经生成了具有高斯分布的伪随机数。正态分布是它的同义词。
我可以从你的问题中得到的唯一其他可能的解释是你想要的东西有意思!= 0和/或方差!= 1.要做到这一点,只需执行mean + sqrt(var) * randn(X)
。
答案 4 :(得分: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
更好。
答案 5 :(得分:1)
确实可以从rand
生成任何内容,但这并不总是很方便,尤其是对于某些复杂的发行版。
MATLAB引入了Probability Distribution Objects,这使它变得更加简单,并允许您无缝访问mean
,var
,truncate
,pdf
,{{1 }},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);