c++ - 将a==b作为参数传递给uniform_real_distribution ok

标签 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 上发生错误?

最佳答案

相关规范段落[26.5.8.2.2, rand.dist.uni.real]/1说:

A uniform_real_distribution random number distribution produces random numbers x, ax < 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为什么这两个约束并不不一致。该问题最初是作为 LWG 2168 提出的。并已通过添加第一段中引用的注释得到解决。该论文提请注意采用不同分布参数的 operator() 重载;结果是约束仅在生成值时发挥作用,而不是在构造分布对象时发挥作用。

关于c++ - 将a==b作为参数传递给uniform_real_distribution ok,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34787758/

相关文章:

c++ - 计算 sse var 最大掩码的最佳方法

c++ - C++ 中逗号分隔值的 `operator<<`

c++ - 如何生成一个总和为 0.0 的 n 大小的随机 float 组?

c++ - 什么是 libc++ 和 libstdc++

c++ - 与 mkstemp 等效的 C++ 标准库是什么?

c++ - 在堆栈上创建对象的不同方法

c++ - 如何在 SQL 中创建类似 DECODE 函数的 C++ 宏?

c++ - 试图用 C++11 替换旧的随机 API

Java随机: Seeding Problem

c++ - 如何在 CMake 中以可移植的方式获取 libstdcxx 隐式链接目录