2014-03-03 41 views
3

是否可以獲取rng-engine的內部狀態?我想實現一個遊戲,我想將rng引擎的內部狀態存儲在保存文件中,以便保存和重新加載不會改變遊戲。<random>獲取rng-engine的內部狀態

我目前唯一能想到的唯一可能是保存種子和從該引擎中獲得的隨機數的數量,但我希望有更優雅的東西。

任何想法? 問候 託拜厄斯

回答

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,輸出爲:

啓動序列:

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

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