Hello i am having some problems generating random numbers with C# Now i have this function.
public Color getRandomColor()
{
Color1 = new Random().Next(new Random().Next(0, 100), new Random().Next(200, 255));
Color2 = new Random().Next(new Random().Next(0, 100), new Random().Next(200, 255));
Color3 = new Random().Next(new Random().Next(0, 100), new Random().Next(200, 255));
Color color = Color.FromArgb(Color1, Color2, Color3);
Console.WriteLine("R: " + Color1 + " G: " + Color2 + " B: " + Color3 + " = " + color.Name);
return color;
}
Now you might notice that there are ALOT of new Random() there, that is because i want to weed out the probability that it could be a same instance error.
I now run this function 8 times, a couple of times. Now here are the out puts.
R: 65 G: 65 B: 65 = ff414141
R: 242 G: 242 B: 242 = fff2f2f2
R: 205 G: 205 B: 205 = ffcdcdcd
R: 40 G: 40 B: 40 = ff282828
R: 249 G: 249 B: 249 = fff9f9f9
R: 249 G: 249 B: 249 = fff9f9f9
R: 94 G: 94 B: 94 = ff5e5e5e
R: 186 G: 186 B: 186 = ffbababa
R: 142 G: 142 B: 142 = ff8e8e8e
R: 190 G: 190 B: 190 = ffbebebe
R: 19 G: 19 B: 19 = ff131313
R: 119 G: 119 B: 119 = ff777777
R: 119 G: 119 B: 119 = ff777777
R: 75 G: 75 B: 75 = ff4b4b4b
R: 169 G: 169 B: 169 = ffa9a9a9
R: 127 G: 127 B: 127 = ff7f7f7f
R: 73 G: 73 B: 73 = ff494949
R: 27 G: 27 B: 27 = ff1b1b1b
R: 125 G: 125 B: 125 = ff7d7d7d
R: 212 G: 212 B: 212 = ffd4d4d4
R: 174 G: 174 B: 174 = ffaeaeae
R: 0 G: 0 B: 0 = ff000000
R: 0 G: 0 B: 0 = ff000000
R: 220 G: 220 B: 220 = ffdcdcdc
As you can see this is not so random again, but why dose this happens? and how can i counter it?
Random works better when using one instance of it.
Try this:
You're creating a new
Random
for each single value you need.Try creating a unique
Random
object and calling the.Next()
function multiple times.Taken from MSDN documentation on Random object :
You are creating many Random objects sequentially, which causes them to be seeded with the same/almost the same timestamp. Thus generating random numbers but equal among them.
Try creating a single instance of Random and using that for all your Random number needs.
Each
new Random()
is seeded with the current time.If you create several
Random
instances in quick succession, and your machine runs it fast enough that they are close enough together to get the same seed, they will return the same sequence of values!Use a single
Random
, calling.Next()
to get each value.This is a fallacy; a stream of numbers from a single
Random
is evenly distributed - effort has gone into making it random.