2015-12-23 5 views
9

.NET基準源がAS the implementation of NextBytes()示す:Random.NextBytesに偏っていますか?

for (int i=0; i<buffer.Length; i++) 
{ 
    buffer[i]=(byte)(InternalSample()%(Byte.MaxValue+1)); 
} 

InternalSampleそれのドキュメンテーションコメントとNext()、この範囲を返すように記載されているという事実によって証明されるように、[0、int.MaxValue)の値を提供します、単にInternalSampleを呼び出します。

InternalSampleint.MaxValue異なる値を生成することができ、その数は256で割り切れるわけではないので、いくつかの値(この場合は255)が発生します。他のものよりも頻度が低い。

私の質問は:

  1. は、この分析は正しいですか、実際に方法が公平なのですか?
  2. バイアスが存在する場合、実際のアプリケーションで問題になるほど強くなっていますか?

FYI私はRandomを暗号目的で使用しないでください。私はそれが有効なユースケース(例えば、シミュレーション)であると考えている。

+0

'int.MaxValue' ** +1 **値 - ゼロを忘れましたか? –

+5

ええええええええ、これは偏った分析です。この演算は、単に値の下位8ビットを取ります。範囲0..int.maxvalueは、256個の値の整数倍数、8,388,608を持ちます。偏見はない、ドナルドは確信した。 –

+1

@AndrewMorton [Random.Next()]のドキュメント(https://msdn.microsoft.com/en-us/library/9b3ta19y(v = vs.110).aspx)は、int.MaxValueが返されることはありません。したがって、 'int.MaxValue + 1'値ではなく、' int.MaxValue'値を持っていますか? – ChaseMedallion

答えて

-3

Knuth vol。 3.2.1.1モジュラスの選択。実際には、256と等しくないモジュラスが必要です。 256を使用すると、結果のバイトの下位4ビットは、257を使用して得られたものよりかなりランダムではありません(12ページ)。

257も素数であり、偏りを減らし、擬似ランダムシーケンスを長くするのに便利です。

疑似ランダムシーケンスは、定義上、真にランダムではありません。暗号化されていないアプリケーションでは、は十分に偏りがあります?疑問がある場合は、アプリケーションが描画する方法で生成された数値をサンプリングし、統計分析を行うことをお勧めします。既製の乱数生成器は、多くのアプリケーションで十分ですが、必ずしも十分ではありません。

+0

"十分に偏っていない"限り、NextBytes()のような派生したメソッドは、私たちが既にNext()から出てきたものの上にバイアスや不均一性を加えないことが望ましいでしょう。例として、[Java Random method nextInt(bound)](https://docs.oracle.com/javase/8/docs/api/java/util/Random.html)は、結果が完全にランダムであると述べていますランダム性の根源は完全にランダムである(それはそうではない)。 – ChaseMedallion

+0

ドキュメントが何を言っているのかというと、ソースを引用する場合は、見積もりを正確にしてください。 "will"と "would"は実質的に異なっている。 – zaph

関連する問題