2

CenterSpaceからダウンロードした Mersenne Twister の C# 実装を使用しています。私はそれに2つの問題があります:

  1. どのようにアルゴリズムをシードしても、 DieHard テストに合格しません。つまり、p 値に対してかなりの数の 1 と 0 が得られるということです。また、269 個の p 値に対する私の KStest は 0 です。まあ、p 値を完全に解釈することはできませんが、結果に含まれる 1 と 0 の数は悪いニュースだと思います。
  2. 数字のランダム性を視覚的に示すように依頼されました。そのため、生成された数値をプロットしますが、これはまったくランダムではないようです。数秒後と数秒の結果の 2 つのスクリーンショットを次に示します。2 番目のスクリーンショットでわかるように、数字はいくつかの平行線上にあります。数値をポイントにマップするためにさまざまなアルゴリズムを試しました。それらはすべて平行線になりますが、角度が異なります。これは、これらのスクリーンショットのポイントに数字をマッピングする方法です: . ご想像のとおり、視覚的な結果はフォームの幅と高さに依存し、これは悲惨な結果です。new Point(number % _canvasWidth, number % _canvasHeight)

アルゴリズムをシードしようとしたいくつかの方法を次に示します。

  1. ユーザーエントリー。いくつかの数値を入力して、アルゴリズムを int 配列としてシードします。
  2. アルゴリズム自体が生成する乱数!!
  3. の配列new Guid().GetHashCode()

ここで何が欠けていますか?アルゴリズムをどのようにシードすればよいですか? ダイハードを通過させるにはどうすればよいですか?

4

3 に答える 3

3

あなたの最初の点について話すことはできませんが、2 番目の問題は、利用する点を計算する方法に関係しています。具体的には、

x = number % _canvasWidth;
y = number % _canvasHeight;

描画先のウィンドウの縦横比にある程度対応する「パターン」が得られます。たとえば、_canvasWidthとが等しい場合、とは常に同じになるように、常に_canvasHeight1 本の対角線を描画します。この場合、このグラフィック表現は適切ではありません。xy

RNG 出力の N ビットを取得し、半分を x 座標に使用し、残りの半分を y 座標に使用するのはどうですか? ウィンドウの範囲外にあるビットについては、次の 2 つのオプションを検討することをお勧めします。

  1. それらを描画しないでください(またはオフスクリーンで描画します)
  2. 線形補間を実行して、ビットの範囲をウィンドウの幅/高さにマップします

どちらのオプションでも、乱数ジェネレーターから取得しているビットのより代表的な画像が得られるはずです。幸運を!

于 2009-11-24T00:42:33.077 に答える
0

x 座標と y 座標のそれぞれに対して新しい乱数を生成することで、縞模様の点プロットの問題を簡単に修正できます。x と y に対して生成された単一の数値を再利用しようとするのは、基本的には時期尚早の最適化ですが、そのルートをたどる場合は、数値からそれぞれに対して異なるビットを抽出するようにしてください。そのままでは、x=n%width;y=n%height画像に見られるように、x と y の間に大きな相関関係が得られます。

私は何年もの間、さまざまな C++ Mersenne Twister の実装 (最近はboostのもの) を使用してランダムな ポイントを生成してきましたが、問題はありませんでした (シード関連またはその他)。それは本当に素晴らしい発電機です。

于 2009-11-24T00:59:14.000 に答える
-1

真の乱数生成は、数学関数では実行できません。真の乱数が重要な場合は、ハードウェア乱数ジェネレーターを入手してください。私はリアルマネーのオンライン ポーカー ゲームを開発しました。そのようなハードウェアは、数字にパターンがないと確信できる唯一の方法です。

Linux 環境を対象とする場合、/dev/random および /dev/urandom 疑似デバイスは、ハードウェア アクティビティを表す乱数が組み込まれているため、数学的ジェネレーターよりもはるかに優れています。

于 2009-11-24T00:44:32.643 に答える