<random>获取rng-engine的内部状态</random>

时间:2014-03-03 05:56:56

标签: c++11

是否有可能获得rng引擎的内部状态?我考虑实现游戏,我想将rng-engine的内部状态存储在保存文件中,以便保存和重新加载不会改变游戏。

我目前唯一能想到的可能是保存种子和从该引擎中获取的随机数的数量,但我希望有更优雅的东西。

任何想法? 问候 托拜厄斯

1 个答案:

答案 0 :(得分:6)

来自cppreference

  

引擎和分发旨在一起使用以生成随机值。所有引擎都可以专门播种,序列化和反序列化,以便与可重复的模拟器一起使用。

您会注意到所有引擎都定义了operator<<operator>>。因此,您应该可以使用这些文件从文件中保存和加载它们。

概念证明:

#include <fstream>
#include <iostream>
#include <random>

int main(int argc, char* argv[])
{
    std::ofstream ofile("out.dat", std::ios::binary);

    std::random_device randDev;
    std::default_random_engine defEngine(randDev());
    std::uniform_int_distribution<int> dist(0, 9);
    auto printSomeNumbers = [&](std::default_random_engine& engine) { for(int i=0; i < 10; i++) { std::cout << dist(engine) << " "; } std::cout << std::endl; };

    std::cout << "Start sequence: " << std::endl;
    printSomeNumbers(defEngine);

    ofile << defEngine;
    ofile.close();

    std::default_random_engine fileEngine;

    std::ifstream ifile("out.dat", std::ios::binary);
    ifile >> fileEngine;

    std::cout << "Orig engine: "; printSomeNumbers(defEngine);
    std::cout << "File engine: "; printSomeNumbers(fileEngine);

    std::cin.get();
    return 0;
}

可以seen on Coliru,输出为:

  

开始序列:

     

6 5 8 2 9 6 5 2 6 3

     

原始引擎:0 5 8 5 2 2 0 7 2 0

     

文件引擎:0 5 8 5 2 2 0 7 2 0