Is Random.NextBytes biased?

本文关键字:biased NextBytes Random Is | 更新日期: 2023-09-27 18:27:48

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

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

InternalSample在[0,int.MaxValue)中提供了一个值,这可以从它的文档注释以及Next()(记录为返回该范围)只调用InternalSample的事实中得到证明。

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

我的问题是:

  1. 这种分析是正确的,还是方法实际上是公正的
  2. 如果存在偏见,那么它是否足以对任何实际应用产生影响

仅供参考,我知道Random不应用于加密目的;我认为它是有效的用例(例如模拟)。

Is Random.NextBytes biased?

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

人们应该问的问题是,它甚至可以检测到吗?例如,需要多少个样本N来建立99%确定性的偏差。据我所知,Ns^2 z^2/ε^2,带有

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

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

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

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

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