我正在尝试编写一个C ++函数,该函数将根据给定的均值和方差返回高斯随机值。

有一个库函数rand(),该函数返回0RAND_MAX之间的随机数。 RAND_MAX没有固定值,但可以保证至少为$ 2 ^ {15} -1 $。它的PDF格式是统一的。我真正在做的是在用户指定的时间调用rand(),然后将其返回值相加,然后将其均值移动到用户指定的均值。上面,我将高斯随机发生器称为$ 10 ^ 7 $倍,并绘制了其返回值的频率。如您所见,它的方差是巨大的,因为它是由许多其他随机值的总和创建的。但是,问题在于其差异。我被困在这一点上,因为我不知道如何将其方差更改为用户指定的值。

这是我的代码(目前不完整;参数“ Variance”被忽略) :

template <class T>
T Random::GetGaussian(T Mean /*= 0*/, T Variance /*= 1*/)
{
    T MeanOfSum = NUM_GAUSSIAN_SUMS / static_cast<T>(2);
    T Rand = 0;
    for (uint64_t i=0; i<NUM_GAUSSIAN_SUMS; i++)
    {
        Rand += static_cast<T>(rand()) / RAND_MAX;
    }
    return Rand - (MeanOfSum - Mean);
}


假设rand()为100,NUM_GAUSSIAN_SUMS为32767。

我想根据参数更改随机变量的方差功能的我的问题是,如何更改此随机变量的方差?我该怎么办?

评论

有比中心极限定理更好和更快的方法来生成高斯随机变量。搜索Box-Muller方法之一;之字形方法据说更好。

stackoverflow.com/questions/7034930/…

在较早的时候,执行时间是一个重要的考虑因素,人们将求和$ 12 $ $ U(0,1)$随机变量(而不是$ 100 $)并减去$ 6 $就可以简单地得出标准的$ N(0,1) $随机变量,然后缩放$ Y = \ sigma X + \ mu $以获得$ N(\ mu,\ sigma ^ 2)$随机变量。 (有关为何起作用的信息,请参见@Hilmar的答案)。对于许多应用程序,此简单方法效果很好,但是将值限制在$(\ mu-6 \ sigma,\ mu + 6 \ sigma)$范围内,当Six-Sigma成为流行语。

@DilipSarwate也许您应该发布这些替代方案作为答案,并说明我们偏爱的理由

@IvoFlipse问题的答案问“固定均值后如何固定方差?”本质上是Hilmar接受的答案所说的,经过注释的修改:通过缩放来固定方差,然后重新确定均值,或者更好的是,不要先确定均值,因为您必须重新确定以后再说首先通过缩放确定方差,然后确定均值。 OP并不表示他/她根本对更好的方法不感兴趣,甚至没有批评nibot的链接,甚至没有Box-Muller方法的代码。所以我将保持现状。

#1 楼

您的初始算法会创建一个随机变量,该变量在0和1之间均匀分布。其方差为1/12。如果对NUM_GAUSSIAN_SUMS个实例求和,则方差为NUM_GAUSSIAN_SUMS/12。为了获得目标方差V,您需要将求和后的随机变量乘以sqrt(V*12/NUM_GAUSSIAN_SUMS)。任何定点类型的数值问题。

#2 楼


如何更改此随机变量的方差?


当然可以通过乘法。 $ c X $的方差为$ c ^ 2 $ $ X $的方差。其中$ c $是乘法常数,$ X $是您的随机变量。

评论


$ \ begingroup $
不幸的是,$ cX $的平均值是$ c $乘以$ X $的平均值,因此OP试图修正方差之前设置的参数之一必须重置为所需值。
$ \ endgroup $
– Dilip Sarwate
2012年3月22日在1:24

$ \ begingroup $
居中,重新缩放,然后恢复均值。缩放居中的随机变量不会影响均值(零)。
$ \ endgroup $
–埃姆雷
2012年3月22日在1:29



#3 楼

还有另一种方式!

考虑一下,如果您想要其他分布而不是高斯分布怎么办?在那种情况下,您将无法真正使用中央极限定理;那么您该如何解决呢?

有一种方法可以将统一随机变量转换为任意PDF。
该方法称为逆变换方法

如果$ U [0-1] $在时间间隔(0,1)上均匀分布,则

$ $

X = F_X ^ {-1}(U)

$$

具有c.d.f. $ F_X(x)$。因此,您需要做的就是将CDF逆函数应用于从统一rv样本中检索到的变量。

另外,与早期方法不同-这将不需要任何迭代,并且将不取决于要使结果更接近高斯的迭代次数。

以下是证明这一点的参考文献之一。

评论


$ \ begingroup $
>还有另一种方法!的确如此,但与所考虑的问题无关,该问题特别是关于高斯随机变量的。高斯CDF或其反函数都不能使用有限数量的运算来表示为基本项,因此无法使用建议的方法。
$ \ endgroup $
– Dilip Sarwate
2012-03-25 15:34