如何在C#中生成随机整数?


当前回答

创建随机对象

Random rand = new Random();

并使用它

int randomNumber = rand.Next(min, max);

你不必每次需要一个随机数时都初始化新的Random(),先初始化一个Random,然后在循环中使用它,或者其他

其他回答

每次执行新的Random()时,它都会初始化。这意味着在一个紧密的循环中,你会多次获得相同的值。您应该保留一个Random实例,并在同一实例上继续使用Next。

//Function to get random number
private static readonly Random getrandom = new Random();

public static int GetRandomNumber(int min, int max)
{
    lock(getrandom) // synchronize
    {
        return getrandom.Next(min, max);
    }
}
Random r = new Random();
int n = r.Next();

对于强随机种子,我总是使用CryptoRNG而不是时间。

using System;
using System.Security.Cryptography;

public class Program
{
    public static void Main()
    {
        var random = new Random(GetSeed());
        Console.WriteLine(random.Next());
    }

    public static int GetSeed() 
    {
        using (var rng = new RNGCryptoServiceProvider())
        {
            var intBytes = new byte[4];
            rng.GetBytes(intBytes);
            return BitConverter.ToInt32(intBytes, 0);
        }
    }
}

这个问题看起来很简单,但答案有点复杂。如果你看到几乎所有人都建议使用Random类,有些人建议使用RNG加密类。但是,什么时候选择。

为此,我们需要首先理解随机性这一术语及其背后的哲学。

我鼓励大家观看我制作的这段视频,它使用C#深入探讨了随机性的哲学https://www.youtube.com/watch?v=tCYxc-2-3年

首先,让我们了解随机性的哲学。当我们告诉一个人在红色、绿色和黄色之间选择时,内部会发生什么。是什么让一个人选择红色、黄色或绿色?

一些最初的想法进入了人们的头脑,决定了他的选择,它可以是最喜欢的颜色,幸运的颜色等等。换句话说,一些最初的触发,我们在RANDOM中称之为SEED。这个SEED是起点,是促使他选择RANDOM值的触发。

现在,如果种子很容易猜测,那么这些随机数被称为伪随机数,而当种子很难猜测时,这些随机数则被称为安全随机数。

例如,一个人根据天气和声音组合选择颜色,那么很难猜出最初的种子。

现在让我发表一个重要声明:-

*“Random”类只生成PSEUDO随机数,要生成SECURE随机数,我们需要使用“RNGCryptoServiceProvider”类。

随机类从CPU时钟中获取种子值,这是非常可预测的。换句话说,C#的RANDOM类生成伪随机数,下面是相同的代码。

Random random = new Random();
int randomNumber = random.Next();

而RNGCryptoServiceProvider类使用OS熵生成种子。OS熵是一个随机值,使用声音、鼠标点击、键盘计时、温度等生成。下面是相同的代码。

using (RNGCryptoServiceProvider rg = new RNGCryptoServiceProvider()) 
{ 
    byte[] rno = new byte[5];    
    rg.GetBytes(rno);    
    int randomvalue = BitConverter.ToInt32(rno, 0); 
}

要了解操作系统熵,请看我的视频,从14:30开始https://www.youtube.com/watch?v=tCYxc-2-3fY,其中解释了OS熵的逻辑。所以用简单的词RNG Crypto生成SECURE随机数。

内置Random类(System.Random)生成的数字生成伪随机数。

如果你想要真正的随机数,我们最接近的就是“安全伪随机生成器”,它可以通过使用C#中的Cryptographic类(如RNGCryptoServiceProvider)生成。

即使如此,如果你仍然需要真正的随机数,你将需要使用一个外部源,比如解释放射性衰变的设备,作为随机数发生器的种子。因为,根据定义,任何纯算法产生的数字都不可能是真正随机的。