将a == b作为参数传递给uniform_real_distribution确定

时间:2016-01-14 10:53:47

标签: c++ random libstdc++

std::uniform_real_distributiona==b一起使用是否可以?这种情况可以解释为无随机性。

在GNU c ++库中:

explicit
param_type(_RealType __a = _RealType(0),
           _RealType __b = _RealType(1))
: _M_a(__a), _M_b(__b)
{
   _GLIBCXX_DEBUG_ASSERT(_M_a <= _M_b);
}

断言接受a==b虽然它可能需要除以零。这是

  • 标准的延伸?
  • 一个巧妙的设计,无论如何都可以使用吗?
  • 某些CPU上发生错误?

1 个答案:

答案 0 :(得分:3)

相关的规范性段落[26.5.8.2.2,rand.dist.uni.real] / 1表示:

  

uniform_real_distribution随机数分布产生随机数 x a x &lt; b ,根据常数概率密度函数分布

p(x | a, b) = 1/(b − a) .
     

[注意:这意味着a == b时未定义p(x | a,b)。 - 结束记录]

请注意 a &lt; b 是对分发的约束。

有趣的是,构造函数(第2段)有一个更宽松的要求:

explicit uniform_real_distribution(RealType a = 0.0, RealType b = 1.0);
     

需要:a≤b[...]

这意味着您可以使用a == b 构造分发对象,但它描述的分发是未定义的。也就是说,您可能不会尝试使用这些参数生成具有此类分布对象的值(这可能确实会导致除以零或其他任何内容)。

另见N3926,了解为什么这两个约束不一致。该问题最初提出为LWG 2168,并已通过在第一段中增加引用的说明得到解决。本文提请注意operator()的过载,它带有不同的分布参数;结果是约束只在生成值时才起作用,而不是在构造分布对象时。