Papel da semente na geração de números randoms

Eu tenho uma grande questão em mente:

Eu posso usar um número de semente para gerar números randoms:

Random rand = new Random(34666666); 

Mas o que não consigo entender é o papel dessa semente. Por exemplo, qual é a diferença de

Esse código com o seguinte:

 Random rand = new Random(); 

Quando você fornece uma semente específica, codificada, ao construtor Random um argumento , os números randoms que serão gerados sempre serão os mesmos, toda vez que você executar o programa. Isso é necessário quando você precisa de uma fonte previsível de números randoms.

No entanto, quando você não fornecer uma semente, o construtor Random escolherá uma semente para você, com base em System.nanoTime . Os números randoms serão diferentes toda vez que você executar o programa, porque a semente será diferente a cada vez.

Cria um novo gerador de números randoms. Este construtor configura a semente do gerador de números randoms para um valor muito provavelmente distinto de qualquer outra invocação deste construtor.

Isso é importante porque o gerador de números randoms do Java é pseudo-random; cada novo número pseudo-random afeta a semente que é usada para o próximo número pseudo-random que é gerado.

A semente permite obter uma sequência determinada de números randoms.

É especialmente útil quando você precisa gerar números randoms, mas também pode ser iniciado novamente e obter os mesmos resultados.

Sem um seed, o construtor escolhe um para você, dependendo do momento em que o object Random é instanciado.

Se você der uma olhada no código para java.util.java ( http://developer.classpath.org/doc/java/util/Random-source.html ), você verá que o construtor usa o timestamp atual para sua semente:

 public Random() { this(System.currentTimeMillis()); } 

Eu sugeriria ler a documentação de Java no random. http://docs.oracle.com/javase/7/docs/api/java/util/Random.html

Alguns pedaços importantes:

If two instances of Random are created with the same seed, and the same sequence of method calls is made for each, they will generate and return identical sequences of numbers.

 public Random() Creates a new random number generator. This constructor sets the seed of the random number generator to a value very likely to be distinct from any other invocation of this constructor. 

A function aleatória de Java é esta:

 numberi+1 = (a * numberi + c) mod m 

O número é sua semente.

O random não é realmente um número random, se eu sei o seu número atual, então eu posso saber todos os números que você terá no futuro. (É por isso que você deve sempre usar um random estático e nunca criar um novo random (você obterá o mesmo número))

Se você precisar de um random mais seguro, use a class SecureRandom do java.

Ele fornece um random mais seguro que usa coisas como, número de movimentos que o mouse fez, a localização atual do mouse, número de segundos desde o último typescript e assim por diante …