我需要能够保存/加载此增强随机生成器的状态:
boost::variate_generator<boost::mt19937, boost::random::uniform_real_distribution<> > generator;
我是这样做的:
std::ostringstream content;
content << this->generator.engine();
问题是,这是非常慢的,是不是有一些替代方式来存储它? (或以原生格式访问随机生成器数据)。这段代码封装在我们的RandomGenerator
类中,所以它可能有点讨厌。
答案 0 :(得分: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
进行更改。
假设Boost许可证的条款是可接受的(它们可能是),请制作您自己的Boost mersenne_twister
模板副本并调整它以接受指向状态数组的指针和对数组的引用指数。然后状态完全在引擎外部,您可以按照自己喜欢的方式进行管理。
顺便提一下,如果这是一个非常频繁的操作并且您不需要MT19937的超高维一致性,您可以考虑使用具有较小状态要求的different engine,例如taus88
。< / p>