在matlab中根据正态分布生成随机数

问题描述 投票:0回答:2

我正在尝试根据我拥有的正态分布特征(平均值和标准差)生成一个随机数。我没有统计和机器学习工具箱。

我知道一种方法是随机生成一个从 0 到 1 的随机数

r
并找到给出该随机数概率的值。我可以通过输入标准法线函数来做到这一点

f= @(y) (1/(1*2.50663))*exp(-((y).^2)/(2*1^2))

并解决

r=integral(f,-Inf,z)

然后用方程

 从该 z 值推断出最终答案 
X

z=(X-mew)/sigma

但据我所知,没有任何 matlab 命令可以让你求解 x,其中 x 是积分的极限。有没有办法做到这一点,或者有更好的方法来随机生成这个数字?

matlab normal-distribution numerical-integration
2个回答
5
投票

您可以使用内置

randn
函数,该函数会生成从均值为零、标准差为 1 的标准正态分布中提取的随机数。要更改此分布,您可以将
randn
的输出乘以您想要的标准差,然后添加您想要的平均值。

% Define the distribution that you'd like to get
mu = 2.5;
sigma = 2.0;

% You can any size matrix of values
sz = [10000 1];

value = (randn(sz) * sigma) + mu;

%   mean(value)
%       2.4696
%
%   std(value)
%       1.9939

如果您只想要分布中的单个数字,则可以使用

randn
的无输入版本来生成标量

value = (randn * sigma) + mu;

5
投票

只是为了好玩,您可以使用均匀随机生成器生成高斯随机变量:

  • 均匀随机变量在 (0,1) 上的对数具有指数分布
  • 其平方根具有瑞利分布
  • 乘以(0,2*pi)上均匀随机变量的余弦(或正弦),结果是高斯分布。您需要乘以 sqrt(2) 才能标准化。

将获得的高斯变量进行归一化(零均值,单位标准差)。如果您需要特定的平均值和标准差,请乘以后者,然后加上前者。

示例(归一化高斯):

m = 1; n = 1e5; % desired output size
x = sqrt(-2*log(rand(m,n))).*cos(2*pi*rand(m,n));

检查:

>> mean(x)
ans =
  -0.001194631660594
>> std(x)
ans =
   0.999770464360453
>> histogram(x,41)

© www.soinside.com 2019 - 2024. All rights reserved.