【问题标题】:Is `std::normal_distribution` guaranteed to be ok with standard deviation 0?`std::normal_distribution` 是否保证标准偏差为 0 正常?
【发布时间】:2012-02-29 11:33:46
【问题描述】:

在 gcc 实现中,这很简单;参数仅适用于as simple multiply and shift of the actual algorithm's output。但我可以想象其他算法在这种特殊情况下会遇到问题。我应该更好地建立一个外部安全防护,还是只给std::normal_distribution的构造函数一个0作为标准偏差参数以获得“非随机分布”,即总是产生平均值的?

(抛开性能)

【问题讨论】:

  • 也许这个问题可以使用更多的背景故事。为什么会不好?
  • @LightnessRacesinOrbit:如果实现除以标准偏差,我想。
  • 我喜欢你在一个关于 RNG 的问题上提到性能,这个问题永远只产生一个值。 :D

标签: c++ random c++11 normal-distribution


【解决方案1】:

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

我想补充一点,这在数学上很有意义:对于 stddev (width) =0,高斯正态分布变为狄拉克三角函数。

狄拉克 delta 函数在任何地方都定义为 ==0,但 x==0 除外,它是未定义的。但是,在积分范围内包含 x==0 的 delta 函数上的每个积分都定义为 1,而不包含 x==0 的积分则为 0。

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

【讨论】:

  • 嗯。浮点数实际上只是实数的有限子集,因此 PDF 实际上是有限多个狄拉克峰的叠加,而不是 ℝ 上的适当函数。通过选择 σ=0,我们简单地将分布限制为其中之一,而不是像其他情况下那样的一些 2²⁰。所以我会说行为可以被表示。但是我是物理学家,我们一直假装狄拉克分布是一个表现良好的函数; 通常没有什么戏剧性的问题......
  • 好吧,我自己也是物理学家,所以基本上我同意。仍然这应该是程序员应该在一段特定的代码中自己决定的事情,所以我认为在标准中保持未定义是一件好事。
  • 那么 PDF 是 t → δ(t-μ)。因此,如果 X 是分布上的随机变量,则 X = μ 几乎可以肯定。在 σ=0 的情况下,当然可以分配合理的行为。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    标准规定如下(§26.5.8.4.4):

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

    因此,0 的标准派生是被标准明确禁止的,因此不能保证有效。因此,建立外部保障似乎是个好主意

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

    【讨论】:

    • 有没有可以找到标准的地方?
    • @user908821:ISO 委员会出售它们,您可能会从您的国家机构获得更低的价格。否则,大多数人应该对之前的草稿感到满意,例如n3242 或下一个草稿n3337(此链接似乎不起作用)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-15
    • 2019-06-03
    • 2014-05-09
    • 1970-01-01
    相关资源
    最近更新 更多