为什么提升uniform_int_distribution需要一个封闭的范围(而不是半开放范围,遵循常见的C++用法)?

bec*_*cko 4 c++ boost

标题说明了一切.文档页面中甚至还有一个警告:

在此输入图像描述

为什么这样,当C++中的常见做法是使用开放范围[开始,结束]?

ste*_*fan 6

只有封闭范围,您可以创建一个uniform_int_distribution产生任何整数的:

uniform_int_distribution<int> dist(std::numeric_limits<int>::min(), std::numeric_limits<int>::max());
Run Code Online (Sandbox Code Playgroud)

如果这是一个半开放的范围,你永远无法达到std::numeric_limits<int>::max(),但只是std::numeric_limits<int>::max() - 1.

std::uniform_int_distribution与C++ 11标准库中的情况相同.

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


参考:Stephan T. Lavavej 在2013年Going Native(大约14分钟)的演讲中提到了这个确切的原因"rand()被认为是有害的".这个讲座是关于C++ 11的<random>,但当然同样的推理也适用于boost.