Possible Duplicate:
Why does it appear that my random number generator isn't random in C#?
How can I generate truly (not pseudo) random numbers with C#?
I’ve created a dice game where the dice is based on a percentile, 1-100.
public static void Roll()
{
Random rand = new Random((int)DateTime.Now.Ticks);
return rand.Next(1, 100);
}
But I don’t feel like it’s a real random based on current time.
If I do
for (int i = 0; i < 5; i++)
{
Console.WriteLine("#" + i + " " + Roll());
}
They would all be the same values, because the DateTime.Now.Ticks didn’t change, it seeded the same number.
I was thinking I could generate a new random seed if the seed was the same due to the current time, but it doesn’t feel like an honest “re-roll”
What should I do to try and replicate a close to real/honest dice roll? Should I use the RNGCryptoServiceProvider class to generate rolls instead?
DateTime.Now.Ticksonly has a resolution of approximately 16ms, so if you create aRandomwith that overload multiple times within a 16ms “slot” they will all be seeded with the same value and therefore you will get the same sequence.Initialize your
Randomoutside your loop so that a singleRandomsequence is produced, rather than creating it each time within the loop which could result inRandomsbeing seeded with the same value and so produce the same sequence.Update
My previous point that the default constructor initialized
Randomwith CPU ticks was incorrect, the default constructor actually uses Environment.TickCount which is:Which still has a low resolution. If you make multiple instances of
Randomin quick succession, they can easily be created within the same time slot and therefore have the same seed value, and create the same sequence. Create a single instance ofRandomand use that.Update
Further to your comments, if you wish to generate a random sequence across multiple threads, please see the following Jon Skeet article which discusses a thread-safe wrapper:
https://codeblog.jonskeet.uk/2009/11/04/revisiting-randomness