【问题标题】:Random Numbers with Gaussian and Uniform Distributions in matlabmatlab中具有高斯和均匀分布的随机数
【发布时间】:2012-12-12 17:08:23
【问题描述】:

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

【问题讨论】:

  • 正态分布是高斯分布。
  • @zhilevan:我是否设法在更新的答案中读懂了你的想法?
  • @mmgp,请注意,是的,我读了

标签: matlab gaussian normal-distribution uniform-distribution


【解决方案1】:

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

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

【讨论】:

  • pease 为我生成带有 uniform 的号码和另一个带有 gaussin 的号码。 tnx
  • 您需要查找您的书籍或其他来源。你读过我回答的第一句话吗?它们是同义词,即它们是同一个东西。
  • 是的,我读过,我想要 2 个分布,1:gaussian(normal),2:uniform
  • 好的,一个uniform 是通过你已经发布的功能获得的。然后您要求normal 和gaussian,它们是相同的。所以你已经知道如何生成uniform和normal/gaussian,还剩下什么?
【解决方案2】:

您可以从 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

你可以对高斯分布做类似的事情。

【讨论】:

  • 一行:sigma = 3; tmp = (2*sigma^2 *(-(log(1 - rand(1e6, 1))))).^.5; hist(tmp, 100).
【解决方案3】:

将rand(dimensions) 用于0 到1 之间的均匀分布。

将randn(dimensions) * sqrt(sigma) + mu 用于高斯分布,平均值为mu,标准差为sigma。

【讨论】:

  • randnrm 在 matlab 2011 中是无效函数 :(
  • 标准差和方差是不同的东西,目前答案是错误的。这里还有另一个答案是正确的。
  • 我可以问一个问题吗?我想要范围 (0,1) 内的随机数,所以我尝试 randn() * sqrt(1) + 0。我得到的数字大于 1,还有一些负数 -2、-3。怎么了?
  • 没什么错 - randn() 给出了一个正态分布,它没有介于 0 和 1 之间。有关更多信息和示例图,请参阅维基百科。
【解决方案4】:

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

MATLAB 引入了Probability Distribution Objects,这使这变得更加容易,并允许您无缝访问mean、var、truncate、pdf、cdf、icdf(逆变换)、@ 987654333@等功能。

您可以对数据进行分布拟合。在这种情况下,我们使用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])  

参考:
Uniform Distribution
Normal (Gaussian) Distribution

【讨论】:

    【解决方案5】:

    randn是产生高斯分布变量的函数(randi和rand产生均匀分布的变量)。

    【讨论】:

    • 不,如果您在 matlab 2011 中尝试帮助 randn,请参阅此帮助 randn RANDN 正态分布的伪随机数。 R = RANDN(N) 返回一个 N×N 矩阵,其中包含从标准正态分布中提取的伪随机值。 RANDN(M,N) 或 RANDN([M,N]) 返回一个 M×N 矩阵。 RANDN(M,N,P,...) 或 RANDN([M,N,P,...]) 返回一个 M×N×P×... 数组。 RANDN 返回一个标量。 RANDN(SIZE(A)) 返回一个与 A 大小相同的数组。注意:大小输入 M、N、P、... 应该是非负整数。负整数被视为 0。
    • 是的。通常表示“高斯”。正如其他人所说,您需要 rand 和 randn。
    • @zhilevan:正态分布也叫高斯分布。
    【解决方案6】:

    按照 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 工作得更好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-23
      • 2011-08-08
      • 1970-01-01
      • 2021-12-28
      • 2017-07-16
      相关资源
      最近更新 更多