从RNGCryptoServiceProvider中只获取数字1-15
本文关键字:数字 1-15 获取 RNGCryptoServiceProvider | 更新日期: 2023-09-27 18:12:44
由于RNGCryptoServiceProvider比random()更"安全"(产生高质量的随机数),所以我觉得使用它。性能不是问题。但是,不是读取最后一位数字,并以某种方式决定何时在其之前添加0或1…有没有更好(更准确)的方法?
byte[] data = new byte[4];
rng.GetBytes(data);
int value = BitConverter.ToInt32(data, 0);
Console.WriteLine(value);
您可以使用模算子(%
)。这导致结果略有偏差,但对于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);
这很简单:
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));
没有办法让RNGCryptoServiceProvider给你数字,因为它不是用于算术的。在密码学中,您使用的是字和字节。如果想要一个不同的RNG用于算术目的,请选择一个不同的库。