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_copyablemt19937

  2. Boost ライセンスの条件が受け入れられると仮定して (おそらくそうです)、Boost のmersenne_twisterテンプレートの独自のコピーを作成し、状態配列へのポインターと配列インデックスへの参照を受け入れるように微調整します。その後、状態は完全にエンジンの外部にあり、好きな方法で管理できます。

ちなみに、これが非常に頻繁な操作であり、MT19937 の非常に高次元の均一性が必要ない場合は、状態要件が小さい別のエンジンtaus88( など) を使用することを検討してください。

于 2013-04-30T23:07:47.837 に答える