如何在字节数组中的某些值之间生成随机整数

时间:2010-12-11 03:01:22

标签: c# random

我正在开发一个程序,我需要从一个字节数组生成一个随机数,该字节数是从生成随机数的设备接收的。问题是;设备将随机数作为字节流发送,我需要它来生成某个值之间的整数。换句话说:

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类,因为该程序将用于加密安全信息,并且伪随机数生成器是不可接受的。

3 个答案:

答案 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;
}