-2

让我们举个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);

我错过了什么吗?

4

1 回答 1

4

在我看来,尽管它存储了一组默认的分布参数,但它实际上是无状态的。

不,不一定。例如,如果底层引擎一次生成 X 个随机位,并且uniform_int_distribution(在给定的范围内)只需要 Y 个随机位(其中 Y < X),则实现可以选择存储剩余的随机位以供以后使用作为优化.

此外,您希望与诸如normal_distribution(许多方法一次生成 2 个随机数,因此您将返回一个并存储另一个以供下次调用)以及您想要预先计算一些参数的分布保持统一的接口在施工时。

于 2016-03-16T23:09:30.283 回答