C# 如何使用RNGCryptoServiceProvider获取大于256的随机数?

C# 如何使用RNGCryptoServiceProvider获取大于256的随机数?,c#,random,C#,Random,如何使用RNGCryptoServiceProvider获取大于256的随机数 代码: private static RNGCryptoServiceProvider rngCsp = new RNGCryptoServiceProvider(); byte[] randomNumber = new byte[1]; //Fill the array with a random value. rngCsp.GetBytes(randomNumber); 用1-8字节填充数组,并使用

如何使用RNGCryptoServiceProvider获取大于256的随机数

代码:

private static RNGCryptoServiceProvider rngCsp = new RNGCryptoServiceProvider();

byte[] randomNumber = new byte[1];

//Fill the array with a random value.   

rngCsp.GetBytes(randomNumber);

用1-8字节填充数组,并使用提取整数

    static ulong RandomUInt64()
    {
        var rng = new RNGCryptoServiceProvider();
        var bytes = new byte[8];
        rng.GetBytes(bytes);
        return BitConverter.ToUInt64(bytes);
    }
如果您希望生成特定范围内的随机数,并且还希望保留分布,则应生成一系列数字并丢弃不在预期范围内的值(蒙特卡罗方法)。如果您正在考虑一个安全的加密随机数生成器,我怀疑这就是您想要的行为

    static int Random(RandomNumberGenerator rng, int min, int max)
    {
        if (min > max) throw new ArgumentException(nameof(min));
        if (min == max) return min;

        var bytes = new byte[4];

        long diff = max - min;

        while (true)
        {
            rng.GetBytes(bytes);

            var rand = BitConverter.ToUInt32(bytes);
            var remainder = (1 + (long) uint.MaxValue) % diff;

            if (rand < max - remainder)
            {
                return (int) (min + (rand % diff));
            }
        }
    }

对于大于256的随机数,是否有任何理由需要使用RNGCryptoServiceProvider

根据emert117所述,字节的最大值为255

如果你需要一个随机数,你可以尝试随机类

Random _randomizer = New Random();
int randomNumber = _randomizer.Next(0,512);

不应在每次需要随机数时创建新的随机对象。通过一次创建一个全局随机对象,可以获得更好的随机性。请参阅@KlausGütter,谢谢您的建议。显然,RNGCryptoServiceProvider是一个比System.random类更好的随机数生成器。这完全取决于你的需要。Random不是线程安全或加密安全的,但在绝大多数情况下,这两者都无关紧要。您可以通过同步解决线程安全缺陷。一个字节=8位的集合,带符号的字节的最大值127,无符号的255感谢您的帮助。是否可以使用您的方法获得小于100000的随机数?感谢Chris的建议。但是,使用这种方法获取所需范围内的随机数需要很长时间。例如,可能需要30分钟到1小时才能获得1-10范围内的5个数字。我正在寻找一种适合任何数字范围的方法,它可以在给定范围内绘制任意数量的随机数。理想情况下,生成随机数的时间不应超过10分钟。最新的解决方案似乎从未选取最大值。函数的范围介于最小值和最大值之间(不包括);这与System.Random API相同。在传递max-value参数时,要将max包含在范围中,只需将max值增加1。不客气!请记住将答案标记为解决方案。
  var rng = new RNGCryptoServiceProvider();
  var random = new RandomGenerator(rng);
  var randomValues = random.Next(-1000, 1000).Take(100).ToArray();
Random _randomizer = New Random();
int randomNumber = _randomizer.Next(0,512);