matlab中具有高斯和均匀分布的随机数

时间:2012-12-12 17:08:23

标签: matlab gaussian normal-distribution uniform-distribution

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

6 个答案:

答案 0 :(得分:14)

使用rand(dimensions)获取0到1之间的统一分布

使用randn(dimensions) * sqrt(sigma) + mu进行高斯分布,其平均值为 mu ,方差为 sigma

Uniform Distribution

Normal Distribution

答案 1 :(得分:7)

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

答案 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,这使它变得更加简单,并允许您无缝访问meanvartruncatepdf,{{1 }},cdf(逆变换),icdf和其他功能。

您可以使分布适合数据。在这种情况下,我们使用median 定义 概率分布对象。然后,我们可以使用makedist 生成

random

可重现的示例:

Histograms

% 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);

参考文献:
Uniform Distribution
Normal (Gaussian) Distribution