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

时间:2013-04-07 11:09:42

标签: c++ boost random stream state

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

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

我是这样做的:

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

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

1 个答案:

答案 0 :(得分:1)

有两种方法,都非常讨厌:

  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模板副本并调整它以接受指向状态数组的指针和对数组的引用指数。然后状态完全在引擎外部,您可以按照自己喜欢的方式进行管理。

  3. 顺便提一下,如果这是一个非常频繁的操作并且您不需要MT19937的超高维一致性,您可以考虑使用具有较小状态要求的different engine,例如taus88。< / p>