根据.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)发生的频率比其他值低。
我的问题是:
- 这个分析是正确的,还是方法实际上是无偏的?
- 如果存在偏差,是否足够强大以影响任何真实的应用程序?
提醒:我知道 Random
不应该用于加密目的;我考虑的是它的有效用途(例如模拟)。
int.MaxValue
值,而不是int.MaxValue + 1
值,对吗? - ChaseMedallionint.MaxValue
或者不包括?我假设(根据文档和源代码中的注释),InternalSample
不能返回int.MaxValue
。请查看防止此情况发生的两个 if 语句在 InternalSample source 中。 - ChaseMedallionif (retVal == MBIG) retVal--;
,其中MBIG
是int.MaxValue
。 - Matthew Watson