0

優れた RNG を実装する必要があり、Mersenne Twister が適していると思います。動作する C++ 実装がどこにも見つかりませんでした。Google 検索が下手なのか、それとも簡単に見つけられないのでしょうか?! 私は前に試しましたrand()

srand((unsigned)time(0));
for (int i = 0; i < 9; i++) {
     random =  rand();
     cout<<random;
}

理由はわかりませんが、確率変数は常に同じ数です.....しかし、を追加するSleep(1000)と、機能します! このような:

srand((unsigned)time(0));
for (int i = 0; i < 9; i++) {
    random =  rand();
    cout<<random;
    Sleep(1000);
}

だから私はMersenne Twisterを試すことにしました...誰かがこれの解決策を見つけることができますか(非常に多数の乱数を見つける必要があるため、使用できませんSleep(1000)。時代がかかります!)またはMersenneの実装を手伝ってくださいツイスターか、別の優れた RNG かもしれません。私の悪い英語をありがとう、そしてごめんなさい...

4

2 に答える 2

1

Boost.Randomは、STL 実装にない場合に利用可能な実装です。

を使用random_deviceして乱数シードを取得し、それをmt19937コンストラクターに渡して乱数ジェネレーターを初期化できます。
次に、コンストラクターで指定した閉じた範囲に均一に分散さuniform_int_distributionれたランダムな整数を取得するために使用できます。[a, b]uniform_int_distribution

次のサンプル コード (g++ 4.8.1 でコンパイル) を検討してください。

#include <iostream>
#include <boost\nondet_random.hpp>
#include <boost\random.hpp>

int main() {        
    // Get a random seed
    boost::random_device rd;
    const auto seed = rd();

    // Marsenne Twister generator
    boost::random::mt19937 mt(seed);

    // Get random integers uniformly distributed in range [0, 99]
    boost::random::uniform_int_distribution<int> dist(0, 99);

    // Print 10 random numbers, uniformly distributed in previous range
    for (int i = 0; i < 10; ++i) {
        std::cout << dist(mt) << " ";
    }
    std::cout << std::endl;    
}
于 2013-10-07T09:10:49.797 に答える