6

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

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

我这样做:

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

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

4

1 回答 1

2

有几种方法,都很老套:

  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 许可证的条款是可接受的(可能是),制作您自己的 Boostmersenne_twister模板副本并对其进行调整以接受指向状态数组的指针和对数组索引的引用。然后状态完全在引擎之外,你可以用任何你喜欢的方式管理它。

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

于 2013-04-30T23:07:47.837 回答