RNGCryptoServiceProvider:生成[0,randomMax]范围内的随机数

Had*_*adi 5 c# random

我编写了以下代码来生成[0,int.MaxValue]范围内的随机数,但我不确定如何在保持均匀分布的同时将范围限制为[0,randomMax]:

private static int GetNextInt32(this RNGCryptoServiceProvider random)
{
  var buffer = new byte[sizeof(int)];
  random.GetBytes(buffer);
  return Math.Abs(BitConverter.ToInt32(buffer, 0));
}
Run Code Online (Sandbox Code Playgroud)

谢谢.

Jim*_*hel 4

这是一种方法: http: //www.informit.com/guides/content.aspx ?g=dotnet&seqNum=775 。请参阅标题为“创建 System.Random 替换”的部分。

但请注意,使用模运算符可能不是确保良好分布的最佳方法。一个可能更好的方法是(int)(NextDouble() * (MaxValue - 1));

您的代码有一个潜在的错误。如果buffer包含十六进制值00 00 00 80,即int.MinValueMath.Abs将抛出异常。

请注意,与调用 相比,调用GetBytesRNGCryptoServiceProvider非常慢的Random.Next。您最好调用GetBytes填充更大的缓冲区,然后从中运出随机数。我的例子展示了这是如何完成的。