C ++の乱数


12

最近、私は、通常はメルセンヌツイスターである、ストックグッドランダムジェネレーターを含む現代言語に慣れました。C ++に戻った今、使用するものを決定する必要があります。

Mersenne Twisterの実装を検索しましたが、非常に多くの実装があることに気付きました。より広く使用されている実装がありますか?


1
C ++と現代言語の分離が好きです。
jcora

2
「より高いレベル」がより適切であると言うかもしれません。
o0 '。

この質問はstackoverflowに属すると思います
-TravisG

5
SOでは、たとえば、医療療法のモンテカルロシミュレーションとは対照的に、ゲームエンジン用であることがわからないため、別の答えを出します。

回答:


19

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.hppxorshift.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;

5
ええ、それは私が探していた一種の答えです。だから私はここでgamedevに投稿しました:)
o0 '。

1
リンクしたファイルには、パブリックドメインにあることを示すものは何もないことに注意してください。著作権法のしくみについては、法律ではデフォルトで「すべての権利の留保」が想定されているため、それについて明確な注意が必要です。一部の司法管轄区では基本的に「これはパブリックドメインにある」と法的拘束力があると認めていないため、MITまたはBSD 2条項ライセンスのようなものを使用する方が実際には安全です。人々があなたのコードを使用するのを見ることに興味があるなら、それを大事にする価値があるかもしれません。
ショーンミドルディッチ

1
@seanmiddleditch:ここでそれについて明確にしています。MITスタイルのライセンスの下でそれが欲しいなら、私はSQLiteのリードに従い、たった1000ドルであなたにそれを与えます。

主な問題は、コード内のヘッダーが何かを宣言している場合(SQLiteが行う、iirc)の欠如です。気にしないなら、それはクールです。友好的な提案をしただけです。
ショーンミドルディッチ

1

gamedevの目的で以前に使用した別のRNGは、ここで説明する Bob Jenkinsの「小さな」RNG です

(彼はISAACと呼ばれる暗号強度のRNGも持っていますが、それはより大きく、より遅く、ゲームはそのレベルの強度を必要としません。)


1
これは、xorshift(4 xorsと3シフト対4 add、6シフト、2 ors、およびxor)よりも高価に見え、期間が悪く、特定の初期化で非常に短いサイクルのリスクがあります。速く見えますが、最速ではありません。大丈夫ですが、最適に近い場所はありません。xorshiftと同じ基本的な配布品質。使用する理由がありません。

けっこうだ。RNG分析について十分に知らないため、分布とサイクルの特性を掘り下げることができません。
ネイサンリード
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.