好像我写
#include <random>
std::minstd_rand engine(1);
std::cout << engine;
然后将打印出引擎的内部状态(这是线性同余生成器)。现在,状态等于种子(1),但是如果我调用随机数并打印出engine
,它会返回一些大数字,这很可能是状态。
如何实际上通过变量获取状态?
答案 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-尚未以这种方式实现丢弃,并且对返回无用。