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

时间:2014-05-16 19:51:22

标签: c++ boost

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

enter image description here

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

1 个答案:

答案 0 :(得分:6)

只有关闭范围,您才能创建uniform_int_distribution,它会生成任何整数:

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

如果这是半开放范围,则永远不会达到std::numeric_limits<int>::max(),而只能达到std::numeric_limits<int>::max() - 1

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

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


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