Random.NextBytes有偏见吗?

时间:2015-12-23 12:18:40

标签: c# random

.NET参考源将the implementation of NextBytes()显示为:

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

InternalSample在[0,int.MaxValue]中提供了一个值,正如它的doc注释所证明的那样,Next()(记录为返回此范围)只调用{{1} }。

我担心的是,由于InternalSample可以产生InternalSample个不同的值,并且该数字不能被256整除,那么我们应该在结果字节中有一些偏差,带有一些值(在这种情况下,只有255)发生频率低于其他人。

我的问题是:

  1. 这种分析是正确的还是方法实际上是无偏见的?
  2. 如果存在偏见,它是否足以对任何实际应用产生影响?
  3. 仅供参考我知道int.MaxValue不应用于加密目的;我正在考虑它是有效的用例(例如模拟)。

2 个答案:

答案 0 :(得分:4)

您的分析确实是正确的。但是缺陷是20亿个 1 / 2^31中的一部分,因此可以忽略不计。

一个人应该问的问题是,它甚至可以被检测到吗?例如,需要多少个样本 N 来确定99%的确定性偏差。从what I know开始, N > s ^ 2 z ^ 2 / epsilon ^ 2,且

  • z = 2.58,
  • epsilon = 1/2 ^ 32和
  • s ^ 2 = p-p ^ 2
  • p = 1/2 ^ 8-1/2 ^ 31

这将需要4.77x10 ^ 17个样本,这个数目如此之大,几乎不会是最明显的缺陷。

答案 1 :(得分:-3)

参考Knuth vol。 2,3.2.1.1模数的选择。你实际上想要一个不等于256的模数;使用256时,结果字节的低4位比使用257(第12页)获得的随机性低得多。

257也是素数,这有助于减少偏差和延长伪随机序列。

根据定义,任何伪随机序列都不是真正随机的。对于非加密应用程序,什么是无偏?如果有疑问,我的建议是按照应用程序绘制它们的方式对生成的数字进行采样并进行一些统计分析。现成的随机数生成器对于许多应用程序来说都足够好,但对你的应用程序来说不一定足够好。