在gcc实现中,这很有效;参数仅应用as simple multiply and shift of the actual algorithm's output。但我可以想象其他算法会遇到像这样的特殊情况的问题。我应该更好地构建一个外部安全防护,或者只是给std::normal_distribution
的构造函数一个0作为标准偏差参数来获得“非随机分布”,即总是产生均值的那个值?
(性能除外)
答案 0 :(得分:4)
标准说明如下(§26.5.8.4.4):
explicit normal_distribution(RealType mean = 0.0, RealType stddev = 1.0);
Requires: 0 < stddev.
因此标准明确禁止0
的标准派生,因此无法保证其有效。因此,建立外部保障似乎是个好主意
即使典型的实现可以在0的标准派生上工作(不确定是否是这种情况),我可以设想一个实现来测试这种情况并在标准派生为零时引发异常并抛出一个如果不是异常(以确保代码是可移植的)。作为替代方案,代码可能会被某个地方的标准派生所划分,而0
的推导也会产生问题。
答案 1 :(得分:3)
您不能使用标准偏差0.从标准,第26.5.8.5.1节:
explicit normal_distribution(RealType mean = 0.0, RealType stddev = 1.0);
Requires: 0 < stddev.
使用值0会导致未定义的行为,因此您需要特殊情况下该值。
答案 2 :(得分:2)
正如之前的作者所指出的,normal_distribution函数的行为仅为stddev&gt; 0定义。
我想补充一点,这在数学上很有意义:对于stddev(width)= 0,高斯正态分布变为Dirac delta函数。
除了x == 0之外,Dirac delta函数被定义为== 0,其中未定义。但是,在积分限制内包含x == 0的delta函数的每个积分定义为1,而不包括x == 0的积分定义为0.
在float / double数字的定义中无法正确表示此行为,因此stddev = 0的正态分布必须保持未定义。