How do I generate a random integer in C#?
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);
}
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.
It's all about the seed.
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.
Random r = new Random();
int n = r.Next();
create a Random object
Random rand = new Random();
and use it
int randomNumber = rand.Next(min, max);
you don't have to initialize new Random()
every time you need a random number, initiate one Random then use it as many times as you need inside a loop or whatever
I used below code to have a random number (not recommended):
var random = new Random((int)DateTime.Now.Ticks);
var randomValue = random.Next(startValue, endValue + 1);
There are a number utility functions or services that are better cached in the same way that System.Random should be, so it lends itself to a generic implementation:
static public class CachedService<T> where T : new() {
static public T Get { get; } = new T();
}
To use for random (or similar):
CachedService<System.Random>.Get.Next(999);