c# - 随机整数 - unity随机数




如何在C#中生成一个随机int数? (15)

如何在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实例并重用它。 如果你创建新实例的时间太近,它们将产生相同的一系列随机数,因为随机发生器从系统时钟中播种。


为什么不使用int randomNumber = Random.Range(start_range, end_range)


你可以尝试使用下面的随机种子值:

var rnd = new Random(11111111); //note: seed value is 11111111

string randomDigits = rnd.Next().ToString().Substring(0, 8);

var requestNumber = $"SD-{randomDigits}";

您可以在MiscUtil类库中使用Jon Skeet的StaticRandom方法,该类库为伪随机数构建。

using System;
using MiscUtil;

class Program
{
    static void Main(string[] args)
    {
        for (int i = 0; i < 100; i++)
        {
            Console.WriteLine(StaticRandom.Next());
        }
    }
}

我已经尝试了所有这些解决方案,不包括COBOL答案......哈哈

这些解决方案都不够好。 我在int循环中需要一个快速的randoms,即使在很宽的范围内,我也会得到大量的重复值。 经过长时间的处理后,我决定终于解决这个问题。

这一切都是关于种子。

我通过解析Guid中的非数字来创建一个随机整数,然后使用它来实例化我的Random类。

public int GenerateRandom(int min, int max)
{
    var seed = Convert.ToInt32(Regex.Match(Guid.NewGuid().ToString(), @"\d+").Value);
    return new Random(seed).Next(min, max);
}

更新 :如果您实例化Random类一次,则不需要种子。 所以最好创建一个静态类并调用一个方法。

public static class IntUtil
{
   private static Random random;

   private static void Init()
   {
      if (random == null) random = new Random();
   }

   public static int Random(int min, int max)
   {
      Init();
      return random.Next(min, max);
   }
}

然后你可以像这样使用静态类。

for(var i = 0; i < 1000; i++)
{
   int randomNumber = IntUtil.Random(1,100);
   Console.WriteLine(randomNumber); 
}

我承认我更喜欢这种方法。


我想添加一个加密安全版本:

RNGCryptoServiceProvider类( MSDNdotnetperls

它实现了IDisposable。

using (RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider())
{
   byte[] randomNumber = new byte[4];//4 for int32
   rng.GetBytes(randomNumber);
   int value = BitConverter.ToInt32(randomNumber, 0);
}

最好用目前的毫秒来播种Random对象,以确保真正的随机数,并且几乎不会使用它多次重复使用它

Random rand = new Random(DateTime.Now.Millisecond);

根据定义,计算机通过确定性过程计算的数字不能是随机的。

如果你想要一个真正的随机数,随机性来自大气噪声或放射性衰变。

你可以尝试例如RANDOM.ORG(它会降低性能)


注意new Random()在当前时间戳上播种。

如果您只想生成一个数字,您可以使用:

new Random().Next( int.MinValue, int.MaxValue )

有关更多信息,请查看Random类,但请注意:

但是,由于时钟具有有限的分辨率,因此使用无参数构造函数来连续创建不同的随机对象会产生随机数发生器,这些随机数发生器会产生相同的随机数序列

所以不要使用这段代码来生成一系列随机数。


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

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

即便如此,如果你仍然需要真正的随机数,你将需要使用外部资源,例如将放射性衰变作为随机数发生器种子的装置。 由于根据定义,纯算法生成的任何数字都不能真正随机。


试试这些简单的步骤来创建随机数字:

创建功能

private int randomnumber(int min, int max)
{
    Random rnum = new Random();
    return rnum.Next(min, max);
}

在想要使用随机数的位置使用上述功能。 假设你想在文本框中使用它。

textBox1.Text = randomnumber(0, 999).ToString();

0分最小,999最大。 您可以将值更改为任何您想要的值。

另请查看此页面上的答案。

http://solutions.musanitech.com/c-how-to-create-random-numbers/


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

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

我鼓励你使用C# https://www.youtube.com/watch?v=tCYxc-2-3fY tCYxc-2-3fY观看这部深入了解RANDOMNESS理念的视频

首先让我们理解RANDOMNESS的理念。 当我们告诉某人在RED,GREEN和YELLOW之间进行选择时,内部发生了什么。 是什么让一个人选择红色或黄色或绿色?

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

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

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

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

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

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

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

要了解OS熵,请参阅此视频https://www.youtube.com/watch?v=tCYxc-2-3fY从11:20开始说明OS熵的逻辑。 因此,用简单的词语RNG Crypto生成SECURE随机数字。


 int n = new Random().Next();

你也可以给Next()函数提供最小值和最大值。 喜欢

 int n = new Random().Next(5,10);

Random r = new Random();
int n = r.Next();

Random randomNumberGenerator = new Random ();
int randomNumber = randomNumberGenerator.Next (lowerBound,upperBound);




random