Random 如何使用RNGCryptoServiceProvider C生成非负随机数(整数)#

Random 如何使用RNGCryptoServiceProvider C生成非负随机数(整数)#,random,rngcryptoserviceprovider,Random,Rngcryptoserviceprovider,我需要在代码中生成非负随机整数。下面的示例生成整数 using (RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider()) { // Buffer storage. byte[] data = new byte[4]; // Ten iterations. for (int i = 0; i < 10; i++) {

我需要在代码中生成非负随机整数。下面的示例生成整数

using (RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider())
    {
        // Buffer storage.
        byte[] data = new byte[4];

        // Ten iterations.
        for (int i = 0; i < 10; i++)
        {
        // Fill buffer.
        rng.GetBytes(data);

        // Convert to int 32.
        int value = BitConverter.ToInt32(data, 0);
        Console.WriteLine(value);
        }
    }
使用(RNGCryptoServiceProvider rng=new RNGCryptoServiceProvider())
{
//缓冲存储器。
字节[]数据=新字节[4];
//十次迭代。
对于(int i=0;i<10;i++)
{
//填充缓冲区。
rng.GetBytes(数据);
//转换为int 32。
int值=位转换器.ToInt32(数据,0);
控制台写入线(值);
}
}
参考: 但它同时给出了正值和负值。如何仅生成非负随机整数? 我之前使用了Random.Next(),它给了我正整数。

伪代码:

repeat
  temp <- RNG.nextInteger();
until temp >= 0;
return temp;
重复
温度=0;
返回温度;

在您的特定情况下,只需使用以代替
ToInt32

using (RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider())
{
    // Buffer storage.
    byte[] data = new byte[4];

    // Ten iterations.
    for (int i = 0; i < 10; i++)
    {
    // Fill buffer.
    rng.GetBytes(data);

    // Convert to int 32.
    int value = BitConverter.ToUInt32(data, 0);
    Console.WriteLine(value);
    }
}
使用(RNGCryptoServiceProvider rng=new RNGCryptoServiceProvider())
{
//缓冲存储器。
字节[]数据=新字节[4];
//十次迭代。
对于(int i=0;i<10;i++)
{
//填充缓冲区。
rng.GetBytes(数据);
//转换为int 32。
int值=位转换器.ToUInt32(数据,0);
控制台写入线(值);
}
}

为什么你可以只取结果的绝对值:
abs(value)
我认为这会产生问题。假设随机no生成器生成-2,我们将使用绝对值并将其用作2。接下来它生成2,随机数仍然是2。没有保证两个连续的随机数是不同的。问题是什么?我必须使用随机整数作为snmp v3数据包的消息Id。所以,我想正如你所建议的,我可以用“abs”方法得到正整数。谢谢你的帮助。我没想到这是个好办法。但这只是一个问题。我在MSDN论坛上读到,使用RNGCryptoServiceProvider生成一个随机数需要更多的时间,如果我跳过一些随机数而得到一个正数,这不会影响性能吗?除非生成大量的随机整数,否则您不太可能注意到差异。在声明速度太慢之前,请始终运行计时测试。无论你做什么,安全的RNG都会比不安全的RNG慢。我看不出这比绝对值更好。将变换应用于随机数是一个标准,当简单的算法可以完成简单但有效的工作时,添加循环是额外的复杂性:-)