将std::uniform_real_distribution
与a==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
虽然它可能需要除以零。这是
答案 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()
的过载,它带有不同的分布参数;结果是约束只在生成值时才起作用,而不是在构造分布对象时。