是否保证“std::normal_distribution”正常,标准偏差为0

Is `std::normal_distribution` guaranteed to be ok with standard deviation 0?

本文关键字:标准 正常 distribution std normal 是否      更新时间:2023-10-16

在gcc实现中,这很简单;参数仅作为实际算法输出的简单乘法和移位来应用。但我可以想象其他算法在这种特殊情况下会出现问题。我应该更好地构建一个外部安全保护,还是只给std::normal_distribution的构造函数一个0作为标准差参数来获得"非随机分布",即总是产生平均值的分布?

(性能除外)

标准规定如下(§26.5.8.4.4):

explicit normal_distribution(RealType mean = 0.0, RealType stddev = 1.0);
    Requires: 0 < stddev.

因此,0的标准推导被标准明确禁止,因此不能保证工作。因此,建立一个外部保障似乎是一个好主意

即使典型的实现将在0的标准派生上工作(不确定情况是否如此),我也可以想象一个测试这种情况的实现,当标准派生为零时抛出异常,如果不是则抛出异常(以确保代码是可移植的)。作为替代方案,代码可能会在某个地方除以标准推导,这对于0的推导也会有问题。

不能使用0的标准偏差。根据标准,第26.5.8.5.1节:

explicit normal_distribution(RealType mean = 0.0, RealType stddev = 1.0);
Requires: 0 < stddev.

使用值0会导致未定义的行为,因此需要对该值进行特殊处理。

正如前面的作者所指出的,normal_distribution函数的行为只为stddev>0定义。

我只想补充一点,这在数学上很有意义:对于stddev(宽度)=0,高斯正态分布变成了Dirac-delta函数。

Dirac delta函数被定义为除了x=0之外的所有地方都是==0,在那里它是未定义的。然而,在其积分极限内包括x==0的delta函数上的每一个积分都被定义为1,而不包含x==0的积分是0。

这种行为不能在浮点/双精度数字的定义中正确表示,因此stddev=0的正态分布必须保持未定义状态。