January 10, 2012

Random <> Random

Yes, Random is not Random at all. The Random class in .NET gives you the functionality to produce random numbers. Anyway how is randomness being calculated? There are plenty of factors used for calculating a new random number. To read a little more, checkout the documentation on MSDN.
Even though the documentation recommends creating just one instance of the Random class and using this instead of creating a new instance every time you need one.
You don't think this is necessary? Well let's just do a simple experiment:

We will now create random numbers. Both snippets use a simple generic list of integers.
var items=new List<int>();

The first snippet creates a new instance of the Random type on each call. I also want to highlight that the loop will run 10.000 times creating random numbers from 1 to 30.
for (int i=0; i<10000; i++)
  items.Add(new Random().Next(1, 30));

The second snippet only creates one instance and reuses it on each call.
Random rnd=new Random();
for (int i=0; i<10000; i++)
  items.Add(rnd.Next(1, 30));

To get the results, we use a StringBuilder object and just write the distinct numbers into it
var sb=new StringBuilder();
foreach (var i in items.Distinct().OrderBy(x => x))
  sb.AppendFormat("{0},", i);
Console.WriteLine("Nums: {0}", sb.ToString());

Now, let's have a look at the results:
The first style returned the following output
3,6,11,16,22,28,

The second style this output
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,

So now you see that using the first style really doesn't provide random numbers. Only 6 numbers out of 30 have been used!
On the opposite the second style seems to return usable random numbers - all numbers have been used.

No comments:

Post a Comment