C++ 比使用流保存boost随机生成器状态更快的替代方法

C++ 比使用流保存boost随机生成器状态更快的替代方法,c++,boost,random,stream,state,C++,Boost,Random,Stream,State,我需要能够保存/加载此boost随机发生器的状态: boost::variate_generator<boost::mt19937, boost::random::uniform_real_distribution<> > generator; boost::变量发生器; 我是这样做的: std::ostringstream content; content << this->generator.engine(); std::ostringstre

我需要能够保存/加载此boost随机发生器的状态:

boost::variate_generator<boost::mt19937, boost::random::uniform_real_distribution<> > generator;
boost::变量发生器;
我是这样做的:

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

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

有几种方法,都非常粗糙:

  • 只需使用以下方法获取原始字节:

    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);
    
    typedef typename std::aligned_storage::type mt19937_storage;
    mt19937_存储;
    标准::memcpy(&存储,&生成器,大小(生成器));
    //...
    generator.engine()=*重新解释(存储);
    
    这对于内存中的保存和加载很好,但确切的格式显然取决于编译器和体系结构,因此如果需要可移植持久性,它将不起作用。对于额外的注意事项,您可以添加一个
    静态断言
    ,例如
    是可复制的
    ,以防止将来对
    mt19937的更改(不太可能)

  • 假设Boost许可证的条款是可以接受的(它们可能是可以接受的),制作Boost的
    mersenne_twister
    模板的您自己的副本,并调整它以接受指向状态数组的指针和对数组索引的引用。然后,状态完全位于引擎外部,您可以按照自己喜欢的方式进行管理


  • 顺便说一下,如果这是一个非常频繁的操作,你不需要MT1937的Uber高维均匀性,你可以考虑使用更小的状态要求,比如<代码> TAUS8。< /P>在我的2.26 GHz Mac Mini上,这个写需要大约0.13毫秒。它需要多快?我不知道,293800个CPU周期似乎太长了!似乎保存和恢复状态的唯一方法是通过流。为了提高性能,您可以编写自己的自定义流(继承自
    std::streambuf
    )并读入其中,或者查看boost::iostreams。好的,2^19937-1长度的循环比我们需要的要长得多,而taus88的大小要小200倍,所以我将尝试:)