【问题标题】:Why boost uniform_int_distribution takes a closed range (instead of a half-open range, following common C++ usage)?为什么 boost uniform_int_distribution 采用封闭范围(而不是半开放范围,遵循常见的 C++ 用法)?
【发布时间】:2014-05-16 19:51:21
【问题描述】:

标题说明了一切。文档页面中甚至还有一个warning

当 C++ 中的常见做法是使用开放范围 [begin, end) 时,为什么要这样做?

【问题讨论】:

    标签: c++ boost


    【解决方案1】:

    只有在封闭范围内,您才能创建一个uniform_int_distribution,它会产生任何整数:

    uniform_int_distribution<int> dist(std::numeric_limits<int>::min(), std::numeric_limits<int>::max());
    

    如果这是一个半开范围,您将永远无法到达std::numeric_limits&lt;int&gt;::max(),而只能到达std::numeric_limits&lt;int&gt;::max() - 1

    对于 C++11 标准库中的std::uniform_int_distribution 也是同样的情况。

    迭代器的半开范围很常见,因为可以很容易地表示空范围(通过设置begin == end)。这对分发没有意义。


    参考:Stephan T. Lavavej 在 Going Native 2013 的演讲 "rand() Considered Harmful"(大约第 14 分钟)中提到了这个确切的原因。本次演讲是关于 C++11 &lt;random&gt;,当然同样的推理也适用于 boost。

    【讨论】:

    • @MarkRansom 那么你还看到了什么?
    • 如果我知道我会添加自己的答案。你关于半开范围的观点也很好。我只是想保留这样一种可能性,即有人可以从 boost 邮件列表中产生记录在案的理由。
    • @MarkRansom 很公平:)
    • 现在已经一年多了,但我还是要问:uniform_real_distribution呢?如果它阻止用户生成 DBL_MAX,为什么它是独占的?
    • @tonytony 我认为这是一个很好且有效的后续问题。老实说,我不知道为什么。请继续并通过打开一个新问题并引用这个问题来提出后续问题:-)
    猜你喜欢
    • 2016-06-29
    • 1970-01-01
    • 1970-01-01
    • 2015-01-10
    • 2012-10-15
    • 2013-10-02
    • 2011-01-28
    • 2017-08-05
    • 2013-11-01
    相关资源
    最近更新 更多