Random.Nextどのようにランダムですか()?
-
22-09-2019 - |
質問
私はランダムクラスのいくつかのテストをやっていると私は、次のコードを使用しています:
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%が、私はこの平均範囲内で取得します。私たちは、ランダムであることに近く、それを呼び出すことができると思ういけない。
私はかなりランダムな番号を取得するために行うことができます。
解決
あなたはサイクルをテストされていません。あなたはそれはあなたが前に持っていた乱数を取得するのにかかる時間の長さのためにテストしています。 の完全に異なるのこと。あなたの数字は、それはあなたが前に持っていた乱数を取得するのにかかるどのくらいテストするためのスポットです。反復の特定の番号の後に衝突を得る確率のチャートのための「誕生日のパラドックス」の下のウィキペディアで見てます。
偶然は、先週私はこの正確な主題に関するブログ記事を書きました。これは、月22日にライブ行きますよ。 <私のブログを参照してください/ A>その後、詳細については。
何をテストすることは、擬似乱数生成器の周期長であるならば、あなたはありません。の数のあなたが前に持っていたのではなく、を探すために必要がありますあなたが前に持っていたことを数字の長い正確な配列の。そこにそれを行うための興味深いいくつかの方法がありますが、私はあなたを伝えることは、おそらく簡単です:ランダムのサイクルの長さは、数十億である、あなたがプログラムことを発見し、その事実を記述することができることはほとんどありませんので。あなたがの多くの数字を格納する必要があると思います。
はしかし、サイクル長は、擬似乱数生成器の品質の唯一の尺度ではありません。覚えておいてください、のPRNGははないランダムの、彼らはの予測可能なのされているので、あなたは「ランダム」のためのあなたのメトリックがあるかについて非常に慎重に考える必要があります。
私たちに詳細を与える:なぜあなたはランダムでどのように「ランダム」気にしていますか?どのようなアプリケーション、あなたが気にしていることのためにそれを使用していますか?ランダム性のどのような側面は、あなたにとって重要なのか?
他のヒント
あなたは数字が繰り返されていない場合はランダム性が優れていることを想定しています。それは真実ではありません。
レアルランダム性メモリがありません。あなたは次の番号を選ぶときは、もう一度同じ番号を得るチャンスはちょうど範囲内の任意の他の数として高いようです。
あなたがサイコロを振り、6を取得した場合、再度サイコロを転がし、再び6を得るために劣らずチャンスはありません。あなたが行に2つのシックスを得るために起こる場合は、それはサイコロが壊れていることを意味するものではありません。
もちろんのランダムクラスのランダム性も完璧ではないが、それはあなたのテストが明らかになったものではありません。それは単にあなたが実際に本物の乱数だけではなく、疑似乱数を作成した場合でも、すべてのranom番号ジェネレータを取得することをpenomenonを示します。
あなたはランダム性のための最高のテストではありません繰り返しペア、によってランダム性を判断しています。あなたが見るリピートが誕生日のパラドックスに似ています: http://en.wikipedia.org/wiki/Birthday_problemあなたが特定のイベントを探してされていない場合に、どこ繰り返しイベントは、小さなサンプルサイズで発生する可能性があります。
/en-us/library/system.random.aspxする
暗号的に安全を生成するには Aを作成するのに適した乱数 ランダムなパスワード、例えば、使用A から派生したクラス System.Security.Cryptography .. ::。RandomNumberGenerator といった System.Security.Cryptography .. ::。RNGCryptoServiceProvider。 の
コンピュータが本当の乱数を生成することはできません。 あなたは本当の乱数が必要な場合(デビッドはあなたドットネットフレームワークから最良の選択肢を与えました) あなたは、外部のランダム源を必要とします。