# How do I generate a random int number?

2010-04-25 c# random

How do I generate a random integer in C#?

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

Beware that `new Random()` is seeded on current timestamp.

If you want to generate just one number you can use:

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

However, because the clock has finite resolution, using the parameterless constructor to create different Random objects in close succession creates random number generators that produce identical sequences of random numbers

So do not use this code to generate a series of random number.

The `Random` class is used to create random numbers. (Pseudo-random that is of course.).

Example:

``````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
``````

If you are going to create more than one random number, you should keep the `Random` instance and reuse it. If you create new instances too close in time, they will produce the same series of random numbers as the random generator is seeded from the system clock.

You could use Jon Skeet's StaticRandom method inside the MiscUtil class library that he built for a pseudo-random number.

``````using MiscUtil;
...

for (int i = 0; i < 100;
Console.WriteLine(StaticRandom.Next());
``````

Every time you do new Random() it is initialized . This means that in a tight loop you get the same value lots of times. You should keep a single Random instance and keep using Next on the same instance.

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

If you have access to an Intel Secure Key compatible CPU, you can generate real random numbers and strings using these libraries: https://github.com/JebteK/RdRand and https://www.rdrand.com/

``````// Check to see if this is a compatible CPU
bool isAvailable = RdRandom.GeneratorAvailable();

// Generate 10 random characters
string key       = RdRandom.GenerateKey(10);

// Generate 64 random characters, useful for API keys
string apiKey    = RdRandom.GenerateAPIKey();

// Generate an array of 10 random bytes
byte[] b         = RdRandom.GenerateBytes(10);

// Generate a random unsigned int
uint i           = RdRandom.GenerateUnsignedInt();
``````

If you don't have a compatible CPU to execute the code on, just use the RESTful services at rdrand.com. With the RdRandom wrapper library included in your project, you would just need to do this (you get 1000 free calls when you signup):

``````string ret = Randomizer.GenerateKey(<length>, "<key>");
uint ret   = Randomizer.GenerateUInt("<key>");
byte[] ret = Randomizer.GenerateBytes(<length>, "<key>");
``````
``````Random rand = new Random();
int name = rand.Next()
``````

Put whatever values you want in the second parentheses make sure you have set a name by writing prop and double tab to generate the code

While this is okay:

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

You'd want to control the limit (min and max mumbers) most of the time. So you need to specify where the random number starts and ends.

The `Next()` method accepts two parameters, min and max.

So if i want my random number to be between say 5 and 15, I'd just do

``````int randomNumber = random.Next(5, 16)
``````

This is the class I use. Works like `RandomNumber.GenerateRandom(1, 666)`

``````internal static class RandomNumber
{
private static Random r = new Random();
private static object l = new object();
private static Random globalRandom = new Random();
private static Random localRandom;
public static int GenerateNewRandom(int min, int max)
{
return new Random().Next(min, max);
}
public static int GenerateLockedRandom(int min, int max)
{
int result;
lock (RandomNumber.l)
{
result = RandomNumber.r.Next(min, max);
}
return result;
}
public static int GenerateRandom(int min, int max)
{
Random random = RandomNumber.localRandom;
if (random == null)
{
int seed;
lock (RandomNumber.globalRandom)
{
seed = RandomNumber.globalRandom.Next();
}
random = (RandomNumber.localRandom = new Random(seed));
}
return random.Next(min, max);
}
}
``````

I've tried all of these solutions excluding the COBOL answer... lol

None of these solutions were good enough. I needed randoms in a fast for int loop and I was getting tons of duplicate values even in very wide ranges. After settling for kind of random results far too long I decided to finally tackle this problem once and for all.

I create a random integer by parsing out the non-digits from Guid, then I use that to instantiate my Random class.

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

Update: Seeding isn't necessary if you instantiate the Random class once. So it'd be best to create a static class and call a method off that.

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

Then you can use the static class like so..

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

I admit I like this approach better.

The numbers generated by the inbuilt `Random` class (System.Random) generates pseudo random numbers.

If you want true random numbers, the closest we can get is "secure Pseudo Random Generator" which can be generated by using the Cryptographic classes in C# such as `RNGCryptoServiceProvider`.

Even so, if you still need true random numbers you will need to use an external source such as devices accounting for radioactive decay as a seed for an random number generator. Since, by definition, any number generated by purely algorithmic means cannot be truly random.

Try these simple steps to create random numbers:

Create function:

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

Use the above function in a location where you want to use random numbers. Suppose you want to use it in a text box.

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

0 is min and 999 is max. You can change the values to whatever you want.

I use below code to have a random number:

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

it's better to seed the Random object with current milliseconds, to ensure true random number, and you almost won't find duplicates using it many times

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

Update

I know that `new Random()` uses the current ticks as seed, but seeding with current milliseconds is still good enough as it's good random start

The last remaining point is that you don't have to initialize `new Random()` every time you need a random number, initiate one Random object then use it as many times as you need inside a loop or whatever

I wanted to add a cryptographically secure version:

RNGCryptoServiceProvider Class (MSDN or dotnetperls)

It implements IDisposable.

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

Numbers calculated by a computer through a deterministic process, cannot, by definition, be random.

If you want a genuine random numbers, the randomness comes from atmospheric noise or radioactive decay.

You can try for example RANDOM.ORG (it reduces performance)

Why not use `int randomNumber = Random.Range(start_range, end_range)` ?

I wanted to demonstrate what happens when a new random generator is used every time. Suppose you have two methods or two classes each requiring a random number. And naively you code them like:

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

Do you think you will get two different IDs? NOPE

``````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
}
}
``````

The solution is to always use a single static random generator. Like this:

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

The question looks very simple but the answer is bit complicated. If you see almost everyone has suggested to use the Random class and some have suggested to use the RNG crypto class. But then when to choose what.

For that we need to first understand the term RANDOMNESS and the philosophy behind it.

I would encourage you to watch this video which goes in depth in the philosophy of RANDOMNESS using C# https://www.youtube.com/watch?v=tCYxc-2-3fY

First thing let us understand the philosophy of RANDOMNESS. When we tell a person to choose between RED, GREEN and YELLOW what happens internally. What makes a person choose RED or YELLOW or GREEN?

Some initial thought goes into the persons mind which decides his choice, it can be favorite color , lucky color and so on. In other words some initial trigger which we term in RANDOM as SEED.This SEED is the beginning point, the trigger which instigates him to select the RANDOM value.

Now if a SEED is easy to guess then those kind of random numbers are termed as PSEUDO and when a seed is difficult to guess those random numbers are termed SECURED random numbers.

For example a person chooses is color depending on weather and sound combination then it would be difficult to guess the initial seed.

Now let me make an important statement:-

*“Random” class generates only PSEUDO random number and to generate SECURE random number we need to use “RNGCryptoServiceProvider” class.

Random class takes seed values from your CPU clock which is very much predictable. So in other words RANDOM class of C# generates pseudo random numbers , below is the code for the same.

**Note: ** `.NET Core 2.0.0+` uses a different seed on the parameterless constructor: instead of CPU clock it uses `Guid.NewGuid().GetHashCode()`.

``````var random = new Random();
int randomnumber = random.Next()
``````

While the `RNGCryptoServiceProvider` class uses OS entropy to generate seeds. OS entropy is a random value which is generated using sound, mouse click, and keyboard timings, thermal temp etc. Below goes the code for the same.

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

To understand OS entropy see this video from 14:30 https://www.youtube.com/watch?v=tCYxc-2-3fY where the logic of OS entropy is explained. So putting in simple words RNG Crypto generates SECURE random numbers.

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

You can also give minimum and maximum value to `Next()` function. Like:

`````` int n = new Random().Next(5, 10);
``````
``````Random random = new Random ();
int randomNumber = random.Next (lowerBound,upperBound);
``````

You can try with random seed value using below:

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

string randomDigits = rnd.Next();

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

Quick and easy for inline, use bellow code:

``````new Random().Next(min, max);

// for example unique name
strName += "_" + new Random().Next(100, 999);
``````

I will assume that you want a uniformly distributed random number generator like below. Random number in most of programming language including C# and C++ is not properly shuffled before using them. This means that you will get the same number over and over, which isn't really random. To avoid to draw the same number over and over, you need a seed. Typically, ticks in time is ok for this task. Remember that you will get the same number over and over if you are using the same seed every time. So try to use varying seed always. Time is a good source for seed because they chage always.

``````int GetRandomNumber(int min, int max)
{
Random rand = new Random((int)DateTime.Now.Ticks);
return rand.Next(min, max);
}
``````

if you are looking for random number generator for normal distribution, you might use a Box-Muller transformation. Check the answer by yoyoyoyosef in Random Gaussian Variable Question. Since you want integer, you have to cast double value to integer at the end.

``````Random rand = new Random(); //reuse this if you are generating many
double u1 = 1.0-rand.NextDouble(); //uniform(0,1] random doubles
double u2 = 1.0-rand.NextDouble();
double randStdNormal = Math.Sqrt(-2.0 * Math.Log(u1)) *
Math.Sin(2.0 * Math.PI * u2); //random normal(0,1)
double randNormal =
mean + stdDev * randStdNormal; //random normal(mean,stdDev^2)
``````

Random Gaussian Variables

I always have methods that generate random numbers which help for various purposes. I hope this may help you too:

``````public class RandomGenerator
{
public int RandomNumber(int min, int max)
{
var random = new Random();
return random.Next(min, max);
}

public string RandomString(int size, bool lowerCase)
{
var builder = new StringBuilder();
var random  = new Random();
char ch;

for (int i = 0; i < size; i++)
{
ch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65)));
builder.Append(ch);
}

if (lowerCase)
return builder.ToString().ToLower();
return builder.ToString();
}
}
``````

For strong random seed I always use CryptoRNG and not Time.

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

Use one instance of Random repeatedly

``````// Somewhat better code...
Random rng = new Random();
for (int i = 0; i < 100; i++)
{
Console.WriteLine(GenerateDigit(rng));
}
...
static int GenerateDigit(Random rng)
{
// Assume there'd be more logic here really
return rng.Next(10);
}
``````

This article takes a look at why randomness causes so many problems, and how to address them. http://csharpindepth.com/Articles/Chapter12/Random.aspx

Sorry, OP indeed requires a random `int` value, but for the simple purpose to share knowledge if you want a random `BigInteger` value you can use following statement:

``````BigInteger randomVal = BigInteger.Abs(BigInteger.Parse(Guid.NewGuid().ToString().Replace("-",""), NumberStyles.AllowHexSpecifier));
``````

The easiest way is probably just `Random.range(1, 3)` This would generate a number between 1 and 2.

The following code returns a random number.

``````int num = random.Next();
``````

The following code returns a random number less than 1000.

``````int num = random.Next(1000);
``````

The following code returns a random number between the min and the max range.

Generate a random number between two numbers:

``````public int RandomNumber(int min, int max)
{
Random random = new Random();
return random.Next(min, max);
}
``````

Just as a note for future reference.

If you're using .NET Core, multiple Random instances isn't as dangerous as before. I'm aware that this question is from 2010, but since this question is old but has some attraction, I think it's a good thing to document the change.

You may refer to this question I made a while back:

Did Microsoft change Random default seed?

Basically, they have changed the default seed from `Environment.TickCount` to `Guid.NewGuid().GetHashCode()`, so if you create 2 instances of Random it won't display the same numbers.

You can see the file diffs from .NET Framework/.NET Core (2.0.0+) here: https://github.com/dotnet/coreclr/pull/2192/commits/9f6a0b675e5ac0065a268554de49162c539ff66d

It isn't as safe as RNGCryptoServiceProvider, but at least it won't give you weird results.

If you want a CSRNG to generate random numbers between a min and max, this is for you. It will initialize `Random` classes with secure random seeds.

``````    class SecureRandom : Random
{
public static byte[] GetBytes(ulong length)
{
RNGCryptoServiceProvider RNG = new RNGCryptoServiceProvider();
byte[] bytes = new byte[length];
RNG.GetBytes(bytes);
RNG.Dispose();
return bytes;
}
public SecureRandom() : base(BitConverter.ToInt32(GetBytes(4), 0))
{

}
public int GetRandomInt(int min, int max)
{
int treashold = max - min;
if(treashold != Math.Abs(treashold))
{
throw new ArithmeticException("The minimum value can't exceed the maximum value!");
}
if (treashold == 0)
{
throw new ArithmeticException("The minimum value can't be the same as the maximum value!");
}
return min + (Next() % treashold);
}
public static int GetRandomIntStatic(int min, int max)
{
int treashold = max - min;
if (treashold != Math.Abs(treashold))
{
throw new ArithmeticException("The minimum value can't exceed the maximum value!");
}
if(treashold == 0)
{
throw new ArithmeticException("The minimum value can't be the same as the maximum value!");
}
return min + (BitConverter.ToInt32(GetBytes(4), 0) % treashold);
}
}
``````

Related