比使用流来节省增强随机生成器状态更快的替代方案

kov*_*rex 5 c++ random boost state stream

我需要能够保存/加载这个boost随机生成器的状态:

boost::variate_generator<boost::mt19937, boost::random::uniform_real_distribution<> > generator;
Run Code Online (Sandbox Code Playgroud)

我是这样做的:

std::ostringstream content;
content << this->generator.engine();
Run Code Online (Sandbox Code Playgroud)

问题是,这是非常慢,是不是有一些替代方式来存储它?(或以原生格式访问随机生成器数据).这段代码封装在我们的RandomGenerator类中,所以它可能有点讨厌.

dha*_*fey 2

有几种方法,都非常hacky:

  1. 只需使用以下方法获取原始字节:

    typedef typename std::aligned_storage<sizeof(boost::mt19937)>::type mt19937_storage;
    mt19937_storage storage;
    std::memcpy(&storage, &generator, sizeof(generator));
    //...
    generator.engine() = *reinterpret_cast<boost::mt19937*>(storage);
    
    Run Code Online (Sandbox Code Playgroud)

    这对于内存中保存和加载来说效果很好,但确切的格式显然取决于编译器和体系结构,因此如果您需要可移植的持久性,它就不起作用。对于额外的警告点,您可以添加 astatic_assertis_trivially_copyable防止(不太可能的)未来对mt19937.

  2. 假设 Boost 许可证的条款是可以接受的(可能是),请制作您自己的 Boostmersenne_twister模板副本并对其进行调整以接受指向状态数组的指针和对数组索引的引用。那么状态就完全在引擎外部了,你可以按照你喜欢的方式管理它。

顺便说一句,如果这是一个非常频繁的操作,并且您不需要 MT19937 的超高维均匀性,您可以考虑使用具有较小状态要求的不同引擎,例如taus88.