如何在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?
一些初步思考进入了决定他select的人的心灵,可以是喜欢的颜色,幸运的颜色等等。 换句话说,我们在RANDOM中称之为SEED的一些初始触发器。这个SEED是一个开始点,它激励他selectRANDOM值。
现在,如果一个SEED很容易猜到,那么这种随机数被称为PSEUDO ,当一个种子难以猜到时,这些随机数被称为SECURED随机数。
例如,一个人select的颜色取决于天气和声音的组合,那么很难猜测最初的种子。
现在让我作一个重要的声明:
*“随机”类只生成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]; 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);