Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Trouble with C# Random class

Tags:

c#

random

I've got a class that represents a coin, which can be flipped with the Coin.Flip() method. Flip() uses random.Next(2); to get either a 0 or a 1 representing heads or tails. This works good.. sort of.

For the program, I need to have 2 coins, which I make, lets say coin1 and coin2.

coin2 always needs to be flipped straight after coin1, which I can do with:

coin1.Flip();
coin2.Flip();

That should work, right?

Well it doesn't! Every time I run those two lines of code, both coins end up with the same values as each other!

The face value is stored in face inside the Coin class, which is defined like this:

private int face;

I don't see anything wrong with what I've done, yet every single time I run the code, they end up identical.

Oh, also, random is defined in the Coin class as well like so:

private Random random = new Random();

Thanks for your help!

EDIT: Here's Flip(), it works now that random is static though.

    public void Flip() {
        face = random.Next(2);
    }
like image 819
Azz Avatar asked Jan 22 '23 09:01

Azz


2 Answers

Random number generators need a seed value. RNG's with an identical seed will produce the same stream of random numbers.

By default, System.Random uses the current time as the seed. If you create two instances almost immediately after each other, they will both likely have the same time value, and therefore will produce the same random number sequence.

You can move the Random to a static member so that all Coin's share the same RNG, but be aware that System.Random is not documented as threadsafe so you can't use multiple Coin's on different threads without some synchronization.

like image 147
Michael Avatar answered Feb 03 '23 10:02

Michael


My guess is that you probably want to redefine your random variable, at the class level, as:

private static Random random = new Random();

This will make every call to Flip() use the same generator, and not reseed constantly. If you're creating the Random instance every call, and call two times very close together, you may get the same seed, and hence the same values.

like image 36
Reed Copsey Avatar answered Feb 03 '23 10:02

Reed Copsey