由于RNGCryptoServiceProvider比Random()更"安全"(产生高质量的随机数),我觉得使用它.性能不是问题.但是,而不是读取最后一位数字,并以某种方式决定何时在它之前添加0或1 ..是否有更好(更准确)的方式?
byte[] data = new byte[4];
rng.GetBytes(data);
int value = BitConverter.ToInt32(data, 0);
Console.WriteLine(value);
Run Code Online (Sandbox Code Playgroud)
您可以使用模运算符(%).这导致略微偏置的结果,但是对于8字节输入,偏差非常小.比偏见小得多System.Random.
byte[] data = new byte[8];
rng.GetBytes(data);
ulong value = BitConverter.ToUInt64(data, 0);
result = (int)(value%15+1);
Run Code Online (Sandbox Code Playgroud)
或者如果你想要完全统一的数字:
byte[] data = new byte[8];
ulong value;
do
{
rng.GetBytes(data);
value = BitConverter.ToUInt64(data, 0);
} while(value==0);
result = (int)(value%15+1);
Run Code Online (Sandbox Code Playgroud)