arkina
arkina

Reputation: 1029

Will Random.Next ever stop being random?

I need to create random numbers between 0 and upto 2 so I am using:

//field level
private static Random _random = new Random();

//used in a method
_random.Next(0, 2)

My question is: will the sequence ever repeat / stop been random? Should I recreate (_random = new Random();) every day?

Upvotes: 5

Views: 927

Answers (7)

xanatos
xanatos

Reputation: 111870

If you read this, you'll see that Random is (currently) based on the subtractive lagged Fibonacci generator of (24, 55) which should guarantee the period to be at least 2^55 . BUT if you look at the end of the page, someone has pointed to a possible bug (the comment of ytosa on October 2010)

http://msdn.microsoft.com/en-us/library/system.random(v=vs.100).aspx

Lets say that the period is long enough unless you need to do "special" applications!

I will add that the Wiki http://en.wikipedia.org/wiki/Lagged_Fibonacci_generator tells us there is a paper that shows that the 24, 55 sequence of lagged Fibonacci isn't "random enough" (under Problems with LFG)

Upvotes: 2

yoav barnea
yoav barnea

Reputation: 5994

It worth mention (at list by my experience) that if you have a method when you declare :

 Random myRand=new Random();
 myRand.Next(10);  
 //...doing somthing with that

and then, if you call this method many times (in a loop) , you might ends up with a lot of duplicates results. (that what happend to me).

and the solution I found was to move Random myRand=new Random() to be a class member initiation statment ( instead of a local variable of a method), match like you did.

after that , there were no longer duplicated results

Upvotes: 0

Simon Mourier
Simon Mourier

Reputation: 138960

Random is not that random. If you need "more" random, you should have a look a cryptographic classes, such as RandomNumberGenerator (abstract), for example: RNGCryptoServiceProvider

Upvotes: 2

user
user

Reputation: 6947

If the purpose is to generate cryptographically secure random numbers, you should probably use a better PRNG. If you just want the occasional random number and true randomness isn't critical (which I imagine given the output values range) then your code is most likely just fine as it is.

Upvotes: 0

Bernd Elkemann
Bernd Elkemann

Reputation: 23550

Math.Random returns a 32-bit signed integer, it will repeat on the 2^32'nd call if you dont reseed. If you DO reseed it will repeat itself sooner.

Upvotes: 2

mavnn
mavnn

Reputation: 9469

If you check the 'remarks' section in the documentation you will find that System.Random is a pseudo-random generator.

This means in theory the sequence does eventually repeat. In practice it very much depends on what you're doing as to how much this matters. For example, the length of the sequence is such that no human will ever notice them repeating. On the otherhand, it's pretty useless for cryptography.

Edit to add: restarting daily won't make much difference. Either the pseudo-randomness is sufficient for you or you need to look into cryptographically secure way of generating random numbers.

Upvotes: 4

Oded
Oded

Reputation: 499072

Your code is fine as it is.

You do not need to create a new Random object daily.

Note that Random is not truly random, but produces a pseudo-random result.

Upvotes: 7

Related Questions