代码之家  ›  专栏  ›  技术社区  ›  Sumeet Kumar

使用RNGCryptoServiceProvider方法生成4位到6位之间的整数

  •  0
  • Sumeet Kumar  · 技术社区  · 6 年前

    先生

    我用过 RNGCryptoServiceProvider 方法生成介于4位和6位之间的整数。错误显示为 Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: startIndex 在线 int rnum = r.Next(BitConverter.ToInt32(rno, 100000)); .

    下面是我正在使用的代码:

    RNGCryptoServiceProvider rg = new RNGCryptoServiceProvider();
                                    byte[] rno = new byte[6];
                                    rg.GetBytes(rno);
                                    Random r = new Random();
                                    int rnum = r.Next(BitConverter.ToInt32(rno, 100000));
    

    我应该如何做到这一点?

    1 回复  |  直到 6 年前
        1
  •  1
  •   bartonjs    6 年前
    byte[] bytes = new byte[4];
    
    using (RandomNumberGenerator rng = RandomNumberGenerator.Create())
    {
        int i = 0;
    
        while (true)
        {
            rng.GetBytes(bytes);
            int val = BitConverter.ToInt32(bytes, 0);
            i++;
    
            // Since 1 million is only 20 bits, just clear all the high bits.
            val &= 0x000FFFFF;
    
            if (val >= 1000 && val < 1000000)
            {
                Console.WriteLine(val);
                Console.WriteLine($"Produced on iteration {i}");
                break;
            }
        }
    }
    

    在100次运行中,需要进行两次第二次迭代才能生成范围内的数字。

    您的特殊例外是要求位转换器读取8字节数组中从字节100000开始的4个字节。

    一般来说,人们不想与系统交叉。安全密码学。RandomNumberGenerator类型和系统。随机的