我从来没有上过统计学课程,所以我希望我在这里问对了地方。
假设我只有两个描述正态分布的数据:均值和方差。我想使用计算机从这个分布中随机抽样,以便我尊重这两个统计数据。
很明显,我可以通过简单地在 0 左右标准化来处理平均值:只需在输出样本之前将添加到每个样本。但我看不到如何以编程方式生成样本以尊重。
我的程序将使用传统的编程语言;我无权访问任何统计包。
我从来没有上过统计学课程,所以我希望我在这里问对了地方。
假设我只有两个描述正态分布的数据:均值和方差。我想使用计算机从这个分布中随机抽样,以便我尊重这两个统计数据。
很明显,我可以通过简单地在 0 左右标准化来处理平均值:只需在输出样本之前将添加到每个样本。但我看不到如何以编程方式生成样本以尊重。
我的程序将使用传统的编程语言;我无权访问任何统计包。
如果您可以从均值 0 和方差 1 的给定分布中采样,那么您可以轻松地从该分布的尺度位置变换中采样,该分布具有均值和方差。如果是来自均值 0 和方差 1 分布的样本,则 是具有均值和方差的样本。因此,您所要做的就是在添加均值之前(方差的平方根)缩放变量。
如何从均值 0 和方差 1 的正态分布中实际获得模拟是另一回事。知道如何实现这些东西很有趣,但无论您是否使用统计包或编程语言,我都建议您获取并使用合适的函数或库来生成随机数。如果您想获得有关使用哪个库的建议,您可能需要添加有关您正在使用的编程语言的特定信息。
编辑:根据评论、其他一些答案以及 Fixee 接受这个答案的事实,我将提供更多关于如何使用统一变量的转换来产生正常变量的细节。
归根结底,正确实施的方法并不比使用的统一伪随机数生成器好。就个人而言,我更喜欢依赖我认为值得信赖的特殊用途库。我几乎总是依赖在 R 中直接在 R 中或通过 C/C++ 中的 API 实现的方法。显然,这不是适合所有人的解决方案,但我对其他库还不够熟悉,无法推荐替代方案。
这实际上是对 Michael Lew 的回答和 Fixee 的评论的评论,但作为答案发布是因为我在这个网站上没有评论的声誉。
十二个独立随机变量的和均匀分布在有意思和方差. 换句话说,
除了 NRH 的答案之外,如果您仍然无法从“标准正态分布”N(0,1) 生成随机样本,下面是一种很好且简单的方法(因为您提到您没有统计包,下面的功能应该可以在大多数标准编程语言中使用)。
1. 将 u 和 v 生成为 -1 到 1 范围内的两个均匀分布的随机
u = 2 r1 - 1
数v = 2 r2 - 1
2.计算w = u^2 + v^2
如果 w > 1 则返回 1
3.return u*z and y= v*z withz= sqrt(-2ln(w)/w)
示例代码如下所示:
u = 2 * random() - 1;
v = 2 * random() - 1;
w = pow(u, 2) + pow(v, 2);
if (w < 1) {
z = sqrt((-2 * log(w)) / w);
x = u * z;
y = v * z;
}
然后使用上面的 MHR 建议来获得随机偏差N(mu, sigma^2)
。
当一个人将许多相似分布的随机值加在一起(我的意思是彼此相似)时,就会出现正态分布。如果将十个或更多均匀分布的随机值相加,则总和非常接近正态分布。(如果您希望它更正常,请添加十多个,但对于几乎所有目的而言,十个就足够了。)
假设您的均匀随机值均匀分布在 0 和 1 之间。总和将介于 0 和 10 之间。从总和中减去 5,所得分布的平均值将为 0。现在将结果除以标准差(接近)正态分布并将结果乘以所需的标准偏差。不幸的是,我不确定十个均匀随机偏差之和的标准偏差是多少,但如果我们幸运的话,有人会在评论中告诉我们!
我更喜欢用这些术语与学生谈论正态分布,因为在许多系统中正态分布假设的效用完全源于许多随机影响的总和导致正态分布的特性。