Por que foram 181783497276652981e 8682522807148012escolhidos 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 181783497276652981para criar outro uniquificador de semente para ser armazenado na próxima vez que new Random()for chamado.
Os literais 181783497276652981Le 8682522807148012Lnã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 . 8682522807148012não aparece no papel, mas 181783497276652981aparece - como uma substring de outro número ,, 1181783497276652981que está 181783497276652981com um 1prefixado.
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 181783497276652981um mérito aceitável?
E por que foi 8682522807148012escolhido?
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 1na 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 181783497276652981Lverdade, parece ser um erro de digitação e você pode enviar um relatório de bug.
seedUniquifierpode ser extremamente disputado em uma caixa de 64 núcleos. Um thread local teria sido mais escalonável.

