【问题标题】:What is the standard way to get the state of a C++0x random number generator?获取 C++0x 随机数生成器状态的标准方法是什么?
【发布时间】:2011-02-28 12:36:46
【问题描述】:

我正在尝试学习新的 C++0x 随机数生成器方法 (26.5),并在符合 C++0x 的随机数引擎 (26.5.1.4) 上实现。

该标准详细介绍了种子序列所需的接口,以及如何将它们传递给构造函数或引擎的seed 函数。

但是,我找不到任何标准接口来从引擎创建或生成种子序列,从而获取其内部状态。有吗?还是只能通过复制构造/分配或复制初始种子序列在引擎之间复制状态?

如果不可能,有谁知道不提供这样一个接口的理由是什么(如果有的话)?

【问题讨论】:

  • 这假设任何状态都可以通过种子序列实现。这是一个正确的假设吗?
  • @MSalters:我认为是这样,或者至少我认为这不会是一个繁重的限制。任何计算的内部状态都可以表示为一系列整数。

标签: c++ random c++11


【解决方案1】:

没有用于从引擎状态生成种子或种子序列的 API。但是,引擎的状态可以流式传输到 istream 中,并从 ostream 中提取。并且引擎的状态是 EqualityComparable 与另一个引擎的状态(对于相同类型的引擎)。

人们可能会检查通过将引擎流式传输到它而生成的 istream。但是,该 istream 的格式未指定。

【讨论】:

    【解决方案2】:

    这也是我的理解。 (要明确一点:我认为只能通过复制构造/赋值或使用相同的初始种子序列构造并生成相同数量的伪随机数来在引擎之间复制状态。)

    【讨论】:

      【解决方案3】:

      内部状态不必看起来像种子序列。我认为这接近于向编译器询问二进制文件的源代码。不可能。

      您可以复制整个引擎,并让副本再次重新生成相同的序列。或者您可以将状态流式传输到文件,然后重新加载。

      【讨论】:

      • 内部状态不必看起来像种子序列。 但是,由于种子序列除了初始化其内部状态外,对引擎没有标准影响,标准似乎没有理由不要求它。对种子序列进行大量修改以建立您的状态并不能真正为您带来任何好处。
      • @Joe :也许不是,但这正是标准要求大多数引擎做的事情。引擎根据种子序列的参数建立其状态,它不只是存储序列。
      • 简单地生成种子序列的 n 个元素并将每个元素复制到您的内部状态中,正如我所知道的每个 RNG(当然,这当然不是全部!),并不排除重新生成序列.实际上,这意味着这样做很简单——只需将您的内部状态复制回来即可。我想不出种子序列的不可逆修改会带来好处的情况。
      猜你喜欢
      • 2011-08-25
      • 2011-08-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-17
      • 2012-05-29
      • 1970-01-01
      • 1970-01-01
      • 2019-06-04
      相关资源
      最近更新 更多