You're providing a constant seed value to the random number generator:
Random gen = new Random(1535636);
Don't do that. It will always provide the same values. Just call the default constructor:
Random gen = new Random();
That
Creates a new random number generator. Its seed is initialized to a value based on the current time:
http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Random.html#Random()
Why?
As with most "standard library" random number generators, Random
is a "Pseudorandom number generator". That means it is not actually generating random numbers! Instead, it is calculating them in a very defined fashion - they just look like random numbers, and they tend to have a decent distribution.
PRNGs are initialized with a seed value which sets their internal state. If you provide the same seed value every time, the PRNG is going to be in the same state every time you run it, and thus, provide the same sequence of numbers!
The thing that makes them seem random all the time, is that usually1 they are "seeded" by default with a time-based value. In most libraries this is a time-dervied value with very good precision. So most of the time, if you see someone seeding their PRNG, it is probably incorrect, or at least very unnecessary.
1 - Note: This is not the case with rand()
from libc: "If no seed value is provided, the rand() function is automatically seeded with a value of 1."
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…