我正在开发一个程序,我需要从一个字节数组生成一个随机数,该字节数是从生成随机数的设备接收的。问题是;设备将随机数作为字节流发送,我需要它来生成某个值之间的整数。换句话说:
int GenerateRandom(int min, int max, byte[] rndr) {
//Do something with the bytes to make a random integer here between min and max
}
不,我不能在.NET中使用内置的Random类,因为该程序将用于加密安全信息,并且伪随机数生成器是不可接受的。
答案 0 :(得分:3)
java.util.Random
课程的source code可能会对您有所帮助。我知道,我知道,这不是C#,但还没有下来投票。算法是重要的位:给定一个随机位源,生成一个介于0和n之间的整数。将范围[0..n]转换为[min..max]非常简单。
我确信你可以用相似数量的代码在C#中实现相同的算法:大约12行,包括2个紧密括号和2行输入验证。
编辑:nextInt(int n)
功能是您要查看的功能。
EDIT2:或者,您可以使用RNGCryptoServiceProvider
播种高质量的随机位。对于您的目的而言,这可能是足够安全的,特别是如果您可以使用新的,高质量的随机性进行重新设置。
有趣的是,msdn网站无法在Linux上使用Chrome。谁有thunk?
答案 1 :(得分:0)
如果你需要一个加密的强随机数,那么.NET框架就有RNGCryptoServiceProvider类用于此目的。
GetBytes()使用加密强大的随机值序列填充字节数组。
答案 2 :(得分:0)
如果此字节数组已包含随机数,则可以将其用作样本值。在这个例子中,我使用前4个字节,你可以修改它适用于任何适用的字大小,并使其旋转。
static int GenerateRandom(int min, int max, byte[] rndr)
{
int isamp = (int)(((uint)rndr[3] << 24) | ((uint)rndr[2] << 16) | ((uint)rndr[1] << 8) | ((uint)rndr[0]));
if (isamp < 0)
isamp += int.MaxValue;
double samp = isamp * 4.6566128752457969E-10;
return (int)(samp * (max - min)) + min;
}