【问题标题】:Confusion about the interface design of C++11 random distributions关于 C++11 随机分布的接口设计的困惑
【发布时间】:2016-03-16 22:13:02
【问题描述】:

我们以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);

我错过了什么吗?

【问题讨论】:

  • 我不确定我是否理解您的投诉。您是在问如何将发行版和引擎打包在一起?如果是,那么您可以使用boost::variate_generator

标签: c++ c++11 language-lawyer c++-standard-library library-design


【解决方案1】:

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

不,不一定。例如,如果底层引擎一次生成 X 个随机位,而uniform_int_distribution(具有给定范围)只需要 Y 个随机位(其中 Y

此外,您希望与 normal_distribution (其中许多方法一次生成 2 个随机数,因此您将返回一个并存储另一个以供下次调用)之类的东西保持统一的接口,以及您的分布d 想在构建时预先计算一些参数。

【讨论】:

  • 这是有道理的。所以,这是一种优化。
猜你喜欢
  • 1970-01-01
  • 2012-08-18
  • 2012-04-10
  • 1970-01-01
  • 2011-01-18
  • 2013-10-04
  • 1970-01-01
  • 1970-01-01
  • 2013-04-07
相关资源
最近更新 更多