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

2024-04-19

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

boost::variate_generator<boost::mt19937, boost::random::uniform_real_distribution<> > generator;

我这样做:

std::ostringstream content;
content << this->generator.engine();

问题是,这非常慢,是否有其他方法来存储它? (或以本机格式访问随机生成器数据)。这段代码封装在我们的RandomGenerator类,所以它可能有点令人讨厌。


有几种方法,都非常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);
    

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

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

顺便说一句,如果这是一个非常频繁的操作,并且您不需要 MT19937 的超高维均匀性,您可以考虑使用不同的引擎 http://www.boost.org/doc/libs/1_53_0/doc/html/boost_random/reference.html#boost_random.reference.generators国家要求较小,例如taus88.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

比使用流保存增强随机生成器状态更快的替代方案 的相关文章

随机推荐