11

私は Random クラスでいくつかのテストを行っており、次のコードを使用しました。

while (x++ <= 5000000)
{
    y = rnd.Next(1, 5000000);
    if (!data.Contains(y))
        data.Add(y);
    else
    {
        Console.WriteLine("Cycle {2}: Repetation found for number {0} after {1} iteration", y, x, i);
        break;
    }
}

rnd の最大制限 (つまり 5000000) を変更し続け、反復回数を変更したところ、次の結果が得られました。

1) if y = rnd.Next(1, 5000) : The average is between 80 to 110 iterations
2) if y = rnd.Next(1, 5000000) : The average is between 2000 to 4000 iterations
3) if y = rnd.Next(1, int.MaxValue) : The average is between 40,000 to 80,000 iterations.

なぜこれらの平均値を取得しているのか、つまり、各値を 10 回チェックしたうち、80% の確率でこの平均範囲内に収まっています。ランダムに近いとは言えないと思います。

かなり乱数を取得するにはどうすればよいですか。

4

5 に答える 5

31

サイクルをテストしていません。以前に取得した乱数を取得するのにかかる時間をテストしています。それは全然違います。あなたの数字は、以前に持っていた乱数を取得するのにかかる時間をテストするのに適しています. ウィキペディアの「誕生日のパラドックス」の下で、特定の回数の反復後に衝突が発生する確率のグラフを確認してください。

偶然にも、先週、まさにこのテーマについてブログ記事を書きました。3 月 22 日に公開されます。詳細については、私のブログを参照してください。

テストしたいのが疑似乱数ジェネレーターのサイクル長である場合は、以前に持っていた数ではなく、以前に持っていた長い正確な数列を探す必要があります。それを行う興味深い方法はたくさんありますが、おそらく私があなたに言うのは簡単です: Random のサイクルの長さは数十億なので、その事実を発見するプログラムを書くことができる可能性は低いです. たくさんの数字を保存する必要があります。

ただし、疑似乱数ジェネレーターの品質の尺度はサイクル長だけではありません。PRNG はランダムではなく、予測可能であることを忘れないでください。したがって、「ランダム性」の測定基準を慎重に検討する必要があります。

詳細を教えてください: なぜ「ランダム」なランダムが気にするのですか? 気になるアプリは何ですか?ランダム性のどの側面があなたにとって重要ですか?

于 2010-02-25T14:51:36.703 に答える
17

You are assuming that the randomness is better if numbers are not repeated. That is not true.

Real randomness doesn't have a memory. When you pick the next number, the chance to get the same number again is just as high as any other number in the range.

If you roll a dice and get a six, then roll the dice again, there is no less chance to get a six again. If you happen to get two sixes in a row, that doesn't mean that the dice is broken.

The randomness in the Random class it of course not perfect, but that is not what your test reveals. It simply shows a phenomenon that you get with every random number generator, even if actually creates real random numbers and not just pseudo-random numbers.

于 2010-02-25T15:03:31.310 に答える
2

http://msdn.microsoft.com/en-us/library/system.random.aspxのドキュメントに従って

たとえば、ランダム パスワードの作成に適した、暗号的に安全な乱数を生成するには、System.Security.Cryptography..::.RandomNumberGenerator から派生したクラス ( System.Security.Cryptography..::.RNGCryptoServiceProvider など) を 使用します。

于 2010-02-25T14:49:13.320 に答える
2

コンピュータは真の乱数を生成できません。実際の乱数が必要な場合 (David はドット ネット フレームワークから最適なオプションを提供しました)、外部乱数ソースが必要です。

于 2010-02-25T14:52:02.940 に答える