将 a==b 作为参数传递给 uniform_real_distribution ok
Pass a==b as parameters to uniform_real_distribution ok
可以将 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
尽管它可能需要除以零。这是
- 标准的扩展?
- 一个无论如何都有效的巧妙设计?
- 发生在某些 CPU 上的错误?
相关规范段落[26.5.8.2.2,rand.dist.uni.real]/1说:
A uniform_real_distribution
random number distribution produces random numbers x, a ≤ x < b, distributed according to the constant probability density function
p(x | a, b) = 1/(b − a) .
[Note: This implies that p(x | a, b) is undefined when a == b
. — end note]
请注意 a < b 是对分布的约束。
有趣的是,构造函数(第 2 段)有一个更宽松的要求:
explicit uniform_real_distribution(RealType a = 0.0, RealType b = 1.0);
Requires: a ≤ b [...]
这意味着您可以构造一个具有a == b
的分布对象,但它描述的分布是未定义的。也就是说,您可能不会尝试使用这些参数(这可能确实会导致除以零或其他任何东西)使用此类分布对象生成值。
另请参阅 N3926 for an opinion why these two constraints are not inconsistent. The issue had originally been raised as LWG 2168 并且已通过在第一段中添加引用的注释来解决。论文提请注意 operator()
的重载,它采用不同的分布参数;结果是约束只在生成值时起作用,在构建分布对象时不起作用。
可以将 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
尽管它可能需要除以零。这是
- 标准的扩展?
- 一个无论如何都有效的巧妙设计?
- 发生在某些 CPU 上的错误?
相关规范段落[26.5.8.2.2,rand.dist.uni.real]/1说:
A
uniform_real_distribution
random number distribution produces random numbers x, a ≤ x < b, distributed according to the constant probability density functionp(x | a, b) = 1/(b − a) .
[Note: This implies that p(x | a, b) is undefined when
a == b
. — end note]
请注意 a < b 是对分布的约束。
有趣的是,构造函数(第 2 段)有一个更宽松的要求:
explicit uniform_real_distribution(RealType a = 0.0, RealType b = 1.0);
Requires: a ≤ b [...]
这意味着您可以构造一个具有a == b
的分布对象,但它描述的分布是未定义的。也就是说,您可能不会尝试使用这些参数(这可能确实会导致除以零或其他任何东西)使用此类分布对象生成值。
另请参阅 N3926 for an opinion why these two constraints are not inconsistent. The issue had originally been raised as LWG 2168 并且已通过在第一段中添加引用的注释来解决。论文提请注意 operator()
的重载,它采用不同的分布参数;结果是约束只在生成值时起作用,在构建分布对象时不起作用。