我编写了以下代码来生成[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)
谢谢.
这是一种方法: http: //www.informit.com/guides/content.aspx ?g=dotnet&seqNum=775 。请参阅标题为“创建 System.Random 替换”的部分。
但请注意,使用模运算符可能不是确保良好分布的最佳方法。一个可能更好的方法是(int)(NextDouble() * (MaxValue - 1));
您的代码有一个潜在的错误。如果buffer包含十六进制值00 00 00 80,即int.MinValue,Math.Abs将抛出异常。
请注意,与调用 相比,调用GetBytes是RNGCryptoServiceProvider非常慢的Random.Next。您最好调用GetBytes填充更大的缓冲区,然后从中运出随机数。我的例子展示了这是如何完成的。
| 归档时间: |
|
| 查看次数: |
7110 次 |
| 最近记录: |