C++11随机分布接口设计的困惑
Confusion about the interface design of C++11 random distributions
我们以uniform_int_distribution
为例。在我看来,尽管它存储了一组默认的分布参数,但它实际上是无状态的。这样的话,设计成像
这样的函数模板不是更好更方便吗?
template <class Engine, class IntType = int>
IntType uniform_int(Engine& engine, IntType a = 0, IntType b = numeric_limits<IntType>::max());
很多时候,我发现自己写了类似
的东西
std::uniform_int_distribution<int> uniform_int(a, b);
... = uniform_int(engine);
或者压缩成一行
... = std::uniform_int_distribution<int>(a, b)(engine);
无论哪种方式,这都让人觉得做作和尴尬。使用函数接口,这可以很自然地完成
... = std::uniform_int(engine, a, b);
如果愿意,您仍然可以存储一组默认的分布参数
auto my_uniform_int = std::bind(std::uniform_int<int>, placeholders::_1, a, b);
我是不是漏掉了什么?
In my opinion, despite the fact that it stores a default set of
distribution parameters, it is practically stateless.
不,不一定。例如,如果底层引擎一次生成 X 个随机位,并且 uniform_int_distribution
(具有给定范围)只需要 Y 个随机位(其中 Y < X),则实现可以选择作为优化来存储剩余的供以后使用的随机位。
此外,您希望与 normal_distribution
之类的东西保持统一的接口(其中许多方法一次生成 2 个随机数,因此您需要 return 一个并存储另一个用于下一个调用),以及您希望在构建时预先计算一些参数的分布。
我们以uniform_int_distribution
为例。在我看来,尽管它存储了一组默认的分布参数,但它实际上是无状态的。这样的话,设计成像
template <class Engine, class IntType = int>
IntType uniform_int(Engine& engine, IntType a = 0, IntType b = numeric_limits<IntType>::max());
很多时候,我发现自己写了类似
的东西std::uniform_int_distribution<int> uniform_int(a, b);
... = uniform_int(engine);
或者压缩成一行
... = std::uniform_int_distribution<int>(a, b)(engine);
无论哪种方式,这都让人觉得做作和尴尬。使用函数接口,这可以很自然地完成
... = std::uniform_int(engine, a, b);
如果愿意,您仍然可以存储一组默认的分布参数
auto my_uniform_int = std::bind(std::uniform_int<int>, placeholders::_1, a, b);
我是不是漏掉了什么?
In my opinion, despite the fact that it stores a default set of distribution parameters, it is practically stateless.
不,不一定。例如,如果底层引擎一次生成 X 个随机位,并且 uniform_int_distribution
(具有给定范围)只需要 Y 个随机位(其中 Y < X),则实现可以选择作为优化来存储剩余的供以后使用的随机位。
此外,您希望与 normal_distribution
之类的东西保持统一的接口(其中许多方法一次生成 2 个随机数,因此您需要 return 一个并存储另一个用于下一个调用),以及您希望在构建时预先计算一些参数的分布。