我需要能够保存/加载这个增强随机生成器的状态:
boost::variate_generator<boost::mt19937, boost::random::uniform_real_distribution<> > generator;
我这样做:
std::ostringstream content;
content << this->generator.engine();
问题是,这非常慢,是否有其他方法来存储它? (或以本机格式访问随机生成器数据)。这段代码封装在我们的RandomGenerator
类,所以它可能有点令人讨厌。
有几种方法,都非常hacky:
-
只需使用以下方法获取原始字节:
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
.
假设 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(使用前将#替换为@)