使用均匀随机变量实现高斯随机变量

信息处理 随机的
2022-01-09 10:04:46

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

有一个库函数,它返回rand()之间的随机数没有固定值,但保证至少会0RAND_MAXRAND_MAX215-1. 它的PDF是统一的。

我正在使用中心极限定理将其转换rand()为高斯变量。我正在做的是调用rand()用户指定的时间,然后将它们的返回值相加,然后将其平均值转换为用户指定的平均值。

高斯 PDF
在上面的绘图中,我将我的高斯随机生成器称为107次,并绘制其返回值的频率。如您所见,它的方差很大,因为它是由许多其他随机值的总和创建的。

它成功返回具有高斯 PDF 和指定平均值的高斯变量。然而,问题在于它的方差。我被困在这一点上,因为我不知道如何将其方差更改为用户指定的值。

这是我的代码(目前不完整;参数“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);
}

假设NUM_GAUSSIAN_SUMS为 100,RAND_MAX则为 32767。

我想根据函数的参数改变随机变量的方差。我的问题是,我怎样才能改变这个随机变量的方差?我该怎么做?

3个回答

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

附带说明一下,模板对于浮点数和双精度数都可以很好地工作,但是对于任何定点类型都会存在严重的数值问题。

我怎样才能改变这个随机变量的方差?

当然是乘法。的方差CX, 在哪里C是乘法常数和X是你的随机变量,是C2的方差X.

还有另一种方法!

想想看,如果你想要其他分布而不是高斯分布怎么办?在那种情况下,你不能真正使用中心极限定理;那你怎么解决呢?

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

如果 ü[0-1]均匀分布在区间 (0, 1) 上,则

X=FX-1(ü)

有 cdfFX(X).

因此,您需要做的就是将逆 CDF 函数应用于您从统一 rv 样本中检索到的变量。

此外,与早期的方法不同 - 这不需要任何迭代,也不取决于将进行多少次迭代以使结果更接近高斯。

这是提供证明的参考文献之一。