Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do random numbers from the random object work?

Tags:

c#

object

random

if I have this: (I already declared the variables)

random1 = new Random();
Console.WriteLine(random1.Next(1, 100));
Console.WriteLine(random1.Next(1, 100));

When I have that, it'll generate a different number for every time I call console.writeline, so this would generate ex. 10, 55 and if you do it again 20,60 so basically random numbers each time, good. But when I add this:

random2 = new Random();
Console.WriteLine(random1.Next(1, 100));
Console.WriteLine(random1.Next(1, 100));
Console.WriteLine(random2.Next(1, 100));
Console.WriteLine(random2.Next(1, 100));

Random1 will generate the same numbers as random! So it will be ex. 5,54,5,54 and if i do it again 70,34,70,34. But it's random2 is a new object so why is it generating the same numbers as random1??

Another example: If I have class like this

 class RandomNumber
    {
        Random random = new Random();
        public int getrandomnumber { get { return random.Next(1, 5); } }
    }

After doing this

randomnumberobject = new RandomNumber();
randomnumberobject2 = new RandomNumber();
Console.WriteLine(randomnumberobject.getrandomnumber);
Console.WriteLine(randomnumberobject2.getrandomnumber);

They'll generate a random number, but both of them will generate the exact same random number. So first time i'd get this 5,5 second time this 3,3 and so on. But if I change the class to this

class RandomNumber
    {
        Random random;
        public int getrandomnumber { get { return random.Next(1, 5); } }
        public RandomNumber(Random random) { this.random = random; }
    }

And do this instead

   random = new Random();
   randomnumberobject = new RandomNumber(random);
   randomnumberobject2 = new RandomNumber(random);
   Console.WriteLine(randomnumberobject.getrandomnumber);
   Console.WriteLine(randomnumberobject2.getrandomnumber);

Suddenly, they both generate different random numbers! So why does this happen? What's the reason? Keep in mind, I'm still kind of a beginner.

like image 589
CsharpFrustration Avatar asked Dec 03 '25 22:12

CsharpFrustration


1 Answers

What you see is "by design" - i.e. it happens because of how the class is implemented... the algorithm it uses needs a "seed" (kind of a starting state) which in this case is based on the clock... as documented on MSDN:

The random number generation starts from a seed value. If the same seed is used repeatedly, the same series of numbers is generated. One way to produce different sequences is to make the seed value time-dependent, thereby producing a different series with each new instance of Random. By default, the parameterless constructor of the Random class uses the system clock to generate its seed value, while its parameterized constructor can take an Int32 value based on the number of ticks in the current time. 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. The following example illustrates that two Random objects that are instantiated in close succession generate an identical series of random numbers.

This means basically that if two Random objects are created at nearly the same time using the parameterless constructor they will produce the same sequence of random numbers since they have been initialized with the same "starting state" based on the clock.

like image 177
Yahia Avatar answered Dec 06 '25 13:12

Yahia