3

くだらないプログラマーであることに加えて、私の専門用語は完璧ではありません。私は自分自身を説明するために最善を尽くすつもりです。randomlib を使用してMersseneツイスター乱数ジェネレーターを実装しました。確かに、私は Visual 8 C++ の乱数ジェネレーターがどのように機能するかについてあまり詳しくありませんが、一度シードするだけで、他のクラスで安全に使用できることがわかりsrand(time(NULL))ましたmain()rand()私が持っている Merssene ツイスターは、オブジェクトを作成し、そのオブジェクトをシードする必要があります。

#include <RandomLib/Random.hpp>
RandomLib::Random r;        // create random number object
r.Reseed();                 // seed with a "unique" seed
float d = r.FloatN();   // a random in [0,1] rounded to the nearest double

クラスで乱数を生成したい場合、毎回オブジェクトを定義せずにこれを行うにはどうすればよいですか。コンピューターの時計を使用すると、実行ごとに同じシードを使用するのではないかと心配しています(毎秒のみ変更されます)。

私は自分自身を正しく説明していますか?

前もって感謝します

4

1 に答える 1

1

Random オブジェクトは基本的に、保持する必要がある状態情報です。すべての通常の手法を使用できます。グローバル変数として使用するか、パラメーターとして渡すことができます。特定のクラスで乱数が必要な場合は、Randomオブジェクトをクラス メンバーとして保持して、そのクラスにランダム性を提供できます。


C++<random>ライブラリは、ランダム性/RNG 状態のソースとしてオブジェクトの構築を必要とする点で似ています。これは、プログラムが状態へのアクセスを制御し、たとえば、複数のスレッドで適切な動作を保証できるため、優れた設計です。C++<random>ライブラリには、メルセンヌ ツイスター アルゴリズムも含まれています。

RNG状態をクラスメンバーとして保存する例を次に示します(std::mt19937の代わりに使用Random)

#include <random> // for mt19937
#include <algorithm> // for std::shuffle
#include <vector>

struct Deck {
    std::vector<Cards> m_cards;
    std::mt19937 eng; // save RNG state as class member so we don't have to keep creating one

    void shuffle() {
        std::shuffle(std::begin(m_cards), std::end(m_cards), eng);
    }
};

int main() {
    Deck d;
    d.shuffle();
    d.shuffle(); // this reuses the RNG state as it was at the end of the first shuffle, no reseeding
}
于 2012-10-31T19:26:21.957 に答える