Mersenne Twister:シードと視覚化
-
21-09-2019 - |
質問
私がダウンロードしたMersenne TwisterのC#実装を使用しています センタースペース. 。私には2つの問題があります:
- どのようにアルゴリズムをシードしても、渡されません 頑固なテスト, 、そしてそれによって、私はp値のためにかなり多くの1と0を取得することを意味します。また、269 p値の私のkStestは0です。まあ、私はp値を完全に解釈することはできませんが、結果のいくつかの1と0は悪いニュースだと思います。
- 数字のランダム性を視覚的に示すように求められました。そのため、生成された数字をプロットしますが、これはまったくランダムに見えません。結果の2つのスクリーンショットを次に示します 数秒後 と 数秒後. 。 2番目のスクリーンショットでわかるように、数字はいくつかの平行線に当てはまります。数字をポイントにマッピングするために、さまざまなアルゴリズムを試しました。それらはすべて平行線になりますが、異なる角度があります!これは、これらのスクリーンショットのポイントに数字をマッピングした方法です。
new Point(number % _canvasWidth, number % _canvasHeight)
. 。ご想像のとおり、視覚的な結果はフォームの幅と高さに依存し、 これは 災害の結果。
アルゴリズムをシードしようとしたいくつかの方法があります。
- ユーザーエントリ。いくつかの数字を入力して、アルゴリズムをINT配列としてシードします。
- アルゴリズム自体によって生成された乱数!!
- の配列
new Guid().GetHashCode()
ここに何が欠けていますか?アルゴリズムをどのようにシードする必要がありますか?どうすればそれを頑固に渡すことができますか?
解決
私はあなたの最初のポイントと話すことはできませんが、2番目の問題はあなたが描くポイントを計算する方法に関係しています。具体的には、
x = number % _canvasWidth;
y = number % _canvasHeight;
描画しているウィンドウのアスペクト比に多少対応する「パターン」を提供します。たとえば、if _canvasWidth
と _canvasHeight
平等だったので、あなたは常に単一の対角線を描いています。 x
と y
常に同じでしょう。この場合、このグラフィック表現は適切ではありません。
RNG出力のnビットを取得し、x座標に半分を使用し、y座標に残りの半分を使用するのはどうですか?窓の境界から落ちるビットについては、2つのオプションを検討する必要があります。
- それらを描かないで(またはそれらを画面から描く)
- 線形補間を実行して、ビットの範囲をウィンドウの幅/高さにマッピングします
どちらのオプションでも、乱数ジェネレーターのビットのより代表的な画像を提供する必要があります。幸運を!
他のヒント
XおよびY座標のそれぞれに新しい乱数を生成することにより、ストライプのポイントプロットの問題を簡単に修正する必要があります。 xとyの生成された単一の数を再利用しようとすることは基本的には早期に最適化されますが、そのルートを下って行く場合は、数字からそれぞれに異なるビットを抽出してください。そのまま、 x=n%width;y=n%height
画像に見られるように、XとYの間に大きな相関関係があります。
私は何年もの間、さまざまなC ++ Mersenne Twisterの実装を使用しています(最近では ブースト's)生成する ランダム ポイント そして、それに困難はありませんでした(種子関連またはその他)。それは本当に素晴らしいジェネレーターです。
真のランダム 数学的な機能では、数の生成を行うことはできません。本当に乱数を持っていることが重要な場合は、 ハードウェア乱数ジェネレーター. 。 Real Money Online Pokerゲームを開発しました。ハードウェアは、数字にパターンがないと確信する唯一の方法です。
Linux環境をターゲットにする場合、 /dev/randomおよび/dev/urandom擬似デバイス ハードウェアアクティビティを表す乱数が組み込まれているため、数学的なジェネレーターよりもはるかに優れています。