3

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

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

3 回答 3

8

您可以使用模运算符( %)。这会导致结果略有偏差,但对于 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);
于 2013-05-09T12:07:14.083 回答
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));
于 2018-11-27T16:02:21.760 回答
-2

没有办法让 RNGCryptoServiceProvider 给你数字,因为它不是用于算术的。在密码学中,您使用单词和字节。如果需要不同的 RNG 用于算术目的,请选择不同的库

于 2013-05-09T12:12:41.830 回答