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

时间:2013-05-09 12:03:09

标签: c# random

由于RNGCryptoServiceProvider比Random()“更安全”(产生高质量的随机数),我觉得使用它。性能不是问题。但是,而不是读取最后一位数字,并以某种方式决定何时在它之前添加0或1 ..是否有更好(更准确)的方式?

byte[] data = new byte[4];
rng.GetBytes(data);
int value = BitConverter.ToInt32(data, 0);
Console.WriteLine(value);

3 个答案:

答案 0 :(得分:8)

您可以使用modulo operator%)。这导致略微偏置的结果,但是对于8字节输入,偏差非常小。比偏见System.Random小得多。

byte[] data = new byte[8];
rng.GetBytes(data);
ulong value = BitConverter.ToUInt64(data, 0);
result = (int)(value%15+1);

或者如果你想要完全统一的数字:

byte[] data = new byte[8];
ulong value;
do
{
    rng.GetBytes(data);
    value = BitConverter.ToUInt64(data, 0);
} while(value==0);
result = (int)(value%15+1);

答案 1 :(得分:0)

很简单:

static int getnum15(RNGCryptoServiceProvider RngCsp)
{
    byte[] p=new byte[1];
    do {
        RngCsp.GetBytes(p);
    } while (p[0]==255);
    return(p[0]%15);
}

因为256 mod 15 = 1。 然后

RNGCryptoServiceProvider rngCsp=new RNGCryptoServiceProvider();
for (int i=0;i<30;i++)
    Console.WriteLine(getnum15(rngCsp));

答案 2 :(得分:-2)

没有办法让RNGCryptoServiceProvider为您提供数字,因为它不适用于算术数据。在密码学中,您使用单词和字节。如果想要一个不同的RNG用于算术目的,请选择different library