【问题标题】:Why is uniform_int_distribution closed range but uniform_real_distribution is half-open range?为什么 uniform_int_distribution 是封闭范围而 uniform_real_distribution 是半开范围?
【发布时间】:2016-06-29 21:39:43
【问题描述】:

uniform_int_distribution 的区间为 [a, b],但 uniform_real_distribution 的区间为 [a, b)。一种天真的方法是做类似b + 0.1 之类的事情,但随后你开始陷入无穷小……幸运的是,正确的方法很简单:

std::uniform_real_distribution<> dis(start, std::nextafter(stop, DBL_MAX));

但为什么这是必要的?更具体地说,这两者不同的原因是什么?

【问题讨论】:

  • 这不是两个问题吗?或者可能是 3 个?
  • 只是想知道,你什么时候注意到浮点值的范围只是半开的?有什么实际应用?

标签: c++ c++11 random


【解决方案1】:

[a, b) 上的均匀真实分布几乎与分布[a, b] 在统计上无法区分。

这两个分布之间的statistical distance 几乎等于一除以ab 之间的浮点数。

也就是说,对于任何给定样本,没有返回01 的统计检验,因此观察到具有第一个分布的1 的概率与观察到@ 的概率不同987654329@ 与第二次分发相比,超过2^{-32}。 (假设您正在开车,例如 std::uniform_real_distribution&lt;float&gt; 使用来自 std::random_device 的纯熵。)

因此在大多数实际应用程序中没有有意义的区别。

如果您想做类似的事情,请使用(a, b] 范围,以防止(极不可能)除以零错误或其他东西,您可以测试您是否完全得到a 并将其替换为@987654335 @如果它是某种关键系统。


FWIW 我也怀疑你的“b 之后的下一个”的解决方案并不总是像你想的那样——在大多数情况下,将会发生的事情是,适配器会将 b - a 计算为浮点数数字,然后从熵源中取一个样本,使用静态转换将其转换为0-1 范围内的浮点数,然后乘以因子b-a,加上a 并返回结果。

如果ab 的比例不完全相同,那么b 中的ε 变化很可能会在浮点减法中丢失,那么这种变化就没有效果。

这不是错误的原因是该标准不要求分发适配器精确生成指定的分发,只要求它在近似意义上收敛到目标。

该标准严格保证分发不会产生超出其规定范围的内容:

26.5.8.1 一般 [rand.dist.general]
1. 从本节 26.5.8 中指定的类模板实例化的每种类型都满足 随机数分布 (26.5.1.6) 类型。
...
3. 生成每个指定分布的算法是实现定义的。
4.指定每个概率密度函数p(z)和每个离散概率函数P (z i )的值 在此部分中是0 在其指定域之外的任何地方。

但是,该标准也提到了统一随机数生成器:

26.5.3.1 [rand.req.urng]
1. 统一随机数生成器 g 类型为 G 是一个返回无符号整数值的函数对象,例如 可能结果范围内的每个值(理想情况下)返回的概率相等。 [注: g 的结果接近理想的程度通常由统计确定。 ——尾注]

由于[a, b)[a, b + epsilon) 在统计上基本上无法区分,因此即使使用b + epsilon 技巧,您仍然不会在输出中看到b,即使您彻底尝试所有可能的种子。

如果这不是标准的观点,那么所有这些适配器都必须精心编写,以便它们始终能够在每个架构上获得完全正确的分布,而且它们的运行速度会慢得多。在大多数应用中,像这样的微小采样不准确是可以容忍的,更重要的是要高效。

【讨论】:

    【解决方案2】:

    让我提供一个理由:使用整数时,有时您会使用它们来实现选择。因此,您有 N 个值,每个值都必须具有相同的可能性。有时,可能的最大值甚至可能是该整数类型中可表示的最大值,因此 N+1 会超出范围并溢出。

    对于浮点值,您通常无法表示范围的限制(例如0.1),并且由于通常不比较数字是否相等(例如1.0/10.0可能会或可能不会比较等于@987654323 @),你忽略了没有出现限制值的事实。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-10
      • 2012-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-19
      • 2013-11-01
      相关资源
      最近更新 更多