C#只从RNGCryptoServiceProvider获取1-15的数字?

Hal*_*ked 3 c# random

由于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)

Cod*_*aos 8

您可以使用模运算符(%).这导致略微偏置的结果,但是对于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)