回答:
C ++ 11には、新しい<random>
インターフェイスの一部として、デフォルトでMersenne Twisterジェネレーターが含まれています。たとえば、MTを使用して[-10、10]の間の整数を均一に生成するには:
std::mt19937 eng; // This is the Mersenne Twister
std:::uniform_int_distribution<int> dist(-10, 10)
for (int i = 0; i < 10; ++i)
std::cout << dist(eng) << std::endl;
このほとんどはTR1を提供するどのコンパイラでも使用できますが、名前はわずかに異なります。std::tr1::mt19937
およびstd::tr1::uniform_int<int>
。
私は通常、人々がメルセンヌ・ツイスターを使用しないように注意します。それは大丈夫なアルゴリズムですが、その人気の多くは単なるマーケティングです。624次元のランダム性は、ほとんどの人が必要とする以上のものであり、MTは比較的重い状態の要件を抱えており、フルテーブルの再計算を行うとキャッシュを爆破する可能性があります。私は個人的にxorshiftにこだわり、ゲームが必要とするあらゆるものに対して優れた期間と合理的な分布を提供し、メモリとCPUの要件はわずかです。
(ほとんど?)C ++ 11準拠のxorshiftジェネレーター-xorshift.hpp、xorshift.cpp-を作成し、パブリックドメインに配置しました。上記のように、これを任意のC ++ 11ランダム化関数にプラグインできます。
xorshift eng;
std:::uniform_int_distribution<int> dist(-10, 10)
for (int i = 0; i < 10; ++i)
std::cout << dist(eng) << std::endl;
gamedevの目的で以前に使用した別のRNGは、ここで説明する Bob Jenkinsの「小さな」RNG です。
(彼はISAACと呼ばれる暗号強度のRNGも持っていますが、それはより大きく、より遅く、ゲームはそのレベルの強度を必要としません。)