C ++:获取线性同余生成器的状态

时间:2018-09-24 20:55:14

标签: random

好像我写

#include <random>
std::minstd_rand engine(1);

std::cout << engine;

然后将打印出引擎的内部状态(这是线性同余生成器)。现在,状态等于种子(1),但是如果我调用随机数并打印出engine,它会返回一些大数字,这很可能是状态。

如何实际上通过变量获取状态?

2 个答案:

答案 0 :(得分:0)

使用字符串流代替stdout。示例:

#include <sstream> ... std::ostringstream os; os << engine; string mystate = os.str();

o中的ostringstream用于输出。

状态应该是最后生成的随机数,这就是为什么没有更简单的方法可以执行此操作的原因。它不像int a; a << engine之类的理想,但必须这样做。如果您经常需要它,则使stringstream操作成为一个函数(可能包括从字符串到整数的转换)。您还可以键入以整数为状态的一对引擎/整数,并定义几个方法,以便在需要性能时自动设置每个世代调用。

如果您不在乎状态,只是想在将来使用它,

int engineState = engine();

现在您有了状态。尽管它与以前不一样,但这取决于您的用例。

答案 1 :(得分:0)

线性同余RNG的输出为状态。或者,如已经注意到的,使用operator<<输出和转换状态

代码

#include <random>
#include <iostream>
#include <sstream>

int main() {
    auto engine = std::minstd_rand{ 1 };

    auto q = engine();

    auto os = std::ostringstream{};

    os << engine;
    auto r = std::stoul(os.str()); // use ul to fit output

    std::cout << q << "   " << os.str() << "   " << r << '\n';

    return 0;
}

打印

48271   48271   48271
根据F.Brown https://laws.lanl.gov/vhosts/mcnp.lanl.gov/pdf_files/anl-rn-arb-stride.pdf的论文,如果特定的实现在O(log 2 (N))时间内正确实现了discard,则可能是

另一种选择。在这种情况下,您可以向后移动一个位置,再次调用RNG并将状态作为输出。

我使用的编译器和库-Visual C ++ 2017 15.7-尚未以这种方式实现丢弃,并且对返回无用。