Por que foram 181783497276652981
e 8682522807148012
escolhidos em Random.java
?
Aqui está o código-fonte relevante do Java SE JDK 1.7:
/**
* 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.
*/
public Random() {
this(seedUniquifier() ^ System.nanoTime());
}
private static long seedUniquifier() {
// L'Ecuyer, "Tables of Linear Congruential Generators of
// Different Sizes and Good Lattice Structure", 1999
for (;;) {
long current = seedUniquifier.get();
long next = current * 181783497276652981L;
if (seedUniquifier.compareAndSet(current, next))
return next;
}
}
private static final AtomicLong seedUniquifier
= new AtomicLong(8682522807148012L);
Portanto, invocar new Random()
sem qualquer parâmetro de semente leva o "uniquificador de semente" atual e executa o XOR com ele System.nanoTime()
. Em seguida, ele usa 181783497276652981
para criar outro uniquificador de semente para ser armazenado na próxima vez que new Random()
for chamado.
Os literais 181783497276652981L
e 8682522807148012L
não são colocados em constantes, mas não aparecem em nenhum outro lugar.
A princípio, o comentário me dá uma pista fácil. A pesquisa online por aquele artigo produz o artigo real . 8682522807148012
não aparece no papel, mas 181783497276652981
aparece - como uma substring de outro número ,, 1181783497276652981
que está 181783497276652981
com um 1
prefixado.
O artigo afirma que 1181783497276652981
é um número que produz um bom "mérito" para um gerador de congruência linear. Este número foi simplesmente copiado incorretamente para o Java? Tem 181783497276652981
um mérito aceitável?
E por que foi 8682522807148012
escolhido?
A pesquisa online por qualquer um dos números não produz nenhuma explicação, apenas esta página que também mostra a queda 1
na frente de 181783497276652981
.
Poderiam ter sido escolhidos outros números que funcionassem tão bem quanto esses dois números? Por que ou por que não?
8682522807148012
é um legado da versão anterior da turma, como pode ser visto nas revisões feitas em 2010 . Na 181783497276652981L
verdade, parece ser um erro de digitação e você pode enviar um relatório de bug.
seedUniquifier
pode ser extremamente disputado em uma caixa de 64 núcleos. Um thread local teria sido mais escalonável.