协慌网

登录 贡献 社区

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

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

答案

Random用于创建随机数。 (当然是伪随机的。)。

例:

Random rnd = new Random();
int month = rnd.Next(1, 13); // creates a number between 1 and 12
int dice = rnd.Next(1, 7);   // creates a number between 1 and 6
int card = rnd.Next(52);     // creates a number between 0 and 51

如果要创建多个随机数,则应保留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 类,有些人建议使用 RNG 加密类。但是什么时候选择什么。

为此,我们首先需要理解 “随机性” 一词及其背后的哲学。

我鼓励你观看这段视频,该视频深入探讨了随机使用 C# https://www.youtube.com/watch?v= tCYxc-2-3fY

首先让我们了解 RANDOMNESS 的哲学。当我们告诉一个人在 RED,GREEN 和 YELLOW 之间做出选择时会发生什么。是什么让一个人选择 RED 或 YELLOW 或 GREEN?

c#随机

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

现在,如果 SEED 很容易猜测,那么这些随机数被称为PSEUDO ,当种子难以猜测时,这些随机数被称为SECURED随机数。

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

c#随机

现在让我作一个重要的声明: -

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

c#随机

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

Random rnd= new Random();
int rndnumber = rnd.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 ,其中解释了操作系统熵的逻辑。因此,使用简单的单词 RNG Crypto 会生成 SECURE 随机数。