【问题标题】:How to generate non-negative random numbers(integer) using RNGCryptoServiceProvider C#如何使用 RNGCryptoServiceProvider C# 生成非负随机数(整数)
【发布时间】:2015-04-01 12:38:46
【问题描述】:

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

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);
        }
    }

参考:http://www.dotnetperls.com/rngcryptoserviceprovider 但它给出了正值和负值。如何只生成非负随机整数? 我之前使用的是 Random.Next(),它给了我正整数。

【问题讨论】:

  • 为什么只能取结果的绝对值:abs(value)w3schools.com/jsref/jsref_abs.asp
  • 我认为这会产生问题。假设随机no生成器生成-2,我们将使用绝对值并将其用作2。接下来它生成2,随机数仍然是2。
  • 好吧,不能保证两个连续的随机数不同。有什么问题?
  • 我必须使用随机整数作为 snmp v3 数据包的 Msg Id。所以,我想你建议我可以使用“abs”方法来获得正整数。感谢您的帮助。

标签: random rngcryptoserviceprovider


【解决方案1】:

在您的具体情况下,只需使用 ToUInt32 代替 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);
    }
}

【讨论】:

  • 简单而有效:-)
【解决方案2】:

伪代码:

repeat
  temp <- RNG.nextInteger();
until temp >= 0;
return temp;

【讨论】:

  • 我没想到..这是一个很好的解决方案。但只是一个问题。我在 MSDN 论坛上读到,使用 RNGCryptoServiceProvider 生成随机数需要更多时间,如果我跳过一些随机数作为正数,会不会影响性能?
  • 除非您生成大量随机整数,否则您不太可能注意到差异。 总是在你声明太慢之前运行一个计时测试。无论您做什么,安全的 RNG 都会比不安全的 RNG 慢。
  • 我看不出这比取绝对值更好。将转换应用于随机数是一种标准,而当简单的算术可以完成这项工作时,添加一个循环会更加复杂
猜你喜欢
  • 1970-01-01
  • 2013-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-17
相关资源
最近更新 更多