Random.NextBytes有偏见吗?

Cha*_*ion 12 c# random

.NET参考源显示as 的实现NextBytes():

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

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

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

我的问题是:

  1. 这种分析是正确的还是方法实际上是无偏见的?
  2. 如果存在偏差,它是否足够强大,对任何实际应用都很重要?

我所知道的Random,不应该用于加密目的; 我在想它是有效的用例(例如模拟).

Sam*_*dal 4

你的分析确实是正确的。但缺陷仅为二十亿分之一,即 1 / 2^31可以忽略不计。

人们应该问的问题是,它是否可以被检测到?例如,需要多少个样本N才能建立具有 99% 确定性的偏差。据我所知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 个样本,这个数字如此之大,以至于很难成为最明显的缺陷。