【问题标题】:minimum value from uniform_real_distribution()uniform_real_distribution() 的最小值
【发布时间】:2015-02-02 06:35:51
【问题描述】:

在我的程序中,我使用 uniform_real_distribution() 生成 0 到 1 之间的统一随机数

#include <random>

default_random_engine e;
uniform_real_distribution<double> u(0,1);

double rand_num = u(e);

我想知道生成的随机数的最小值是多少,除了 0。即两个随机数之间的最小差距。

【问题讨论】:

  • 大概是std::numeric_limits&lt;double&gt;::min()(又名DBL_MIN)。
  • 还需要考虑非规范化数字。

标签: c++ c++11 random


【解决方案1】:

您可以使用std::nextafter 来回答这个问题。

std::nextafter(from, to) 返回from 在to 方向上的下一个可表示的浮点值(可能是非正规的)。

对于from == 0.0,您也可以使用std::numeric_limits&lt;F&gt;::denorm_min(),其中F 是您关心的浮点类型。虽然std::numeric_limits&lt;F&gt;::denorm_min() 总是返回最小的正可表示值,但它可能是一个非规范化的数字。如果F 不支持非规范化,则返回值将等于std::numeric_limits&lt;F&gt;::min()。

感谢 WhozCraig 和 T.C.进行更正。

【讨论】:

  • 有趣的是,std::numeric_limits&lt;double&gt;min() 和 std::nextafter(0.0, 1.0) 在我的 OS X 10.10.2 装备上分别报告了不同的值,2.22507e-308 和 4.94066e-324。
  • @WhozCraig 可能是非规范化数字。试试std::numeric_limits&lt;double&gt;::denorm_min()
  • @WhozCraig :std::numeric_limits&lt;double&gt;::epsilon() 呢?
  • @ildjarn 没有那么小:2.22045e-16.
  • 看起来像 libstdc++ 和 libc++ can generate denormalized numbers,所以我猜测最小值将是 std::numeric_limits&lt;double&gt;::denorm_min()。该标准没有为此明确指定任何内容。
猜你喜欢
  • 2015-10-16
  • 2015-02-06
  • 2019-05-18
  • 2018-03-28
  • 2012-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多