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

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

Random类用于创build随机数。 (当然是伪随机)。

例:

 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 

如果您要创build多个随机数,则应该保留Random实例并重用它。 如果你创build新实例的时间太近了,随机生成器从系统时钟播种,它们将产生相同的一系列随机数。

每次你做新的随机()它被初始化。 这意味着,在一个紧密的循环中,您可以获得相同的价值。 你应该保持一个Random实例,并在同一个实例上继续使用Next。

 //Function to get random number private static readonly Random getrandom = new Random(); private static readonly object syncLock = new object(); public static int GetRandomNumber(int min, int max) { lock(syncLock) { // synchronize return getrandom .Next(min, max); } } 

这个问题看起来很简单,但答案有点复杂。 如果你看到几乎每个人都build议使用Random类,有些人build议使用RNGencryption类。 但是,那么什么时候select。

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

我鼓励你观看这个video,这个video在RANDOMNESS的哲学里深入的使用C# https://www.youtube.com/watch?v= tCYxc-2-3fY

首先让我们理解RANDOMNESS的哲学。 当我们告诉一个人在红色,绿色和黄色之间进行select时,内部会发生什么。 是什么让一个人selectRED或YELLO或GREEN?

c#随机

一些初步思考进入了决定他select的人的心灵,可以是喜欢的颜色,幸运的颜色等等。 换句话说,我们在RANDOM中称之为SEED的一些初始触发器。这个SEED是一个开始点,它激励他selectRANDOM值。

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

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

c#随机

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

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

c#随机

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

 Random rnd= new Random(); int rndnumber = rnd.Next() 

RNGCryptoServiceProvider类使用OS熵来生成种子。 OS熵是使用声音,鼠标点击和键盘定时,热温度等产生的随机值。下面的代码是相同的。

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

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

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

如果你只想生成一个号码,你可以使用:

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

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

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

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

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

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

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

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

RNGCryptoServiceProvider类( MSDN或dotnetperls )

它实现了IDisposable。

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

你可以在MiscUtil类库中使用Jon Skeet的StaticRandom方法,他为伪随机数构build。

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

我已经尝试了所有这些解决scheme,不包括COBOL答案…大声笑

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

这一切都是关于种子。

我通过parsingGuid中的非数字来创build一个随机整数,然后使用它来实例化我的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类一次,则不需要种子。 所以最好是创build一个静态类并调用一个方法。

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

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

我使用下面的代码有一个随机数字:

 var random = new Random((int)DateTime.Now.Ticks); var randomValue = random.Next(startValue, endValue + 1); 

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

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

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

从这里修改答案。

如果您有权访问兼容英特尔安全密钥的CPU,则可以使用这些库生成真正的随机数字和string: https : //github.com/JebteK/RdRand和https://www.rdrand.com/

只需从这里下载最新版本,包括Jebtek.RdRand并为其添加使用语句。 那么,你需要做的是这样的:

 bool isAvailable = RdRandom.GeneratorAvailable(); //Check to see if this is a compatible CPU string key = RdRandom.GenerateKey(10); //Generate 10 random characters string apiKey = RdRandom.GenerateAPIKey(); //Generate 64 random characters, useful for API keys byte[] b = RdRandom.GenerateBytes(10); //Generate an array of 10 random bytes uint i = RdRandom.GenerateUnsignedInt() //Generate a random unsigned int 

如果您没有兼容的CPU来执行代码,只需使用rdrand.com上的RESTful服务即可。 使用您的项目中包含的RdRandom包装器库,您只需要执行此操作(注册时可以获得1000个免费调用):

 string ret = Randomizer.GenerateKey(<length>, "<key>"); uint ret = Randomizer.GenerateUInt("<key>"); byte[] ret = Randomizer.GenerateBytes(<length>, "<key>"); 

虽然这是好的:

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

大部分时间你都想控制限制(最小和最大数字)。 所以你需要指定随机数开始和结束的位置。

Next()方法接受两个参数min和max。

所以如果我想让我的随机数字在5到15之间,我就这样做了

 int randomNumber = random.Next(5, 16) 
 Random rand = new Random(); int name = rand.Next() 

把你想要的值放在第二个圆括号中,确保你已经通过编写prop和double tab来设置一个名字来生成代码

http://pastebin.com/P79GXiVh是我使用的类。; 像RandomNumber.GenerateRandom(1, 666)

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

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

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

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

我想演示每次使用新的随机发生器时会发生什么。 假设你有两个方法或两个类,每个需要一个随机数。 天真地,你编码他们:

 public class A { public A() { var rnd=new Random(); ID=rnd.Next(); } public int ID { get; private set; } } public class B { public B() { var rnd=new Random(); ID=rnd.Next(); } public int ID { get; private set; } } 

你认为你会得到两个不同的ID?

 class Program { static void Main(string[] args) { A a=new A(); B b=new B(); int ida=a.ID, idb=b.ID; // ida = 1452879101 // idb = 1452879101 } } 

解决方法是始终使用一个静态随机生成器。 喜欢这个:

 public static class Utils { public static readonly Random random=new Random(); } public class A { public A() { ID=Utils.random.Next(); } public int ID { get; private set; } } public class B { public B() { ID=Utils.random.Next(); } public int ID { get; private set; } } 

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

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

创buildfunction

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

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

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

0是最小值,999是最大值。 你可以改变任何你想要的值。

另外检查在这个页面上的答案。

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

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

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

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