¿Por qué fueron 181783497276652981
y 8682522807148012
elegido en Random.java
?
Aquí está el código fuente relevante de 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);
Por lo tanto, la invocación new Random()
sin ningún parámetro semilla toma el "uniquificador semilla" actual y lo XOR conSystem.nanoTime()
. Luego se usa 181783497276652981
para crear otro uniquificador de semillas que se almacenará para la próxima vez que new Random()
se llame.
Los literales 181783497276652981L
y 8682522807148012L
no se colocan en constantes, pero no aparecen en ningún otro lugar.
Al principio, el comentario me da una pista fácil. La búsqueda en línea de ese artículo produce el artículo real . 8682522807148012
no aparece en el documento, pero 181783497276652981
aparece, como una subcadena de otro número,1181783497276652981
, que tiene 181783497276652981
un 1
prefijo.
El periódico afirma que 1181783497276652981
es un número que ofrece un buen "mérito" para un generador congruencial lineal. ¿Este número simplemente se copió incorrectamente en Java? ¿ 181783497276652981
Tiene un mérito aceptable?
Y por que fue 8682522807148012
elegido?
La búsqueda en línea de cualquiera de los números no proporciona ninguna explicación, solo esta página que también nota el que se ha caído 1
en frente de 181783497276652981
.
¿Se podrían haber elegido otros números que hubieran funcionado tan bien como estos dos números? ¿Por qué o por qué no?
8682522807148012
es un legado de la versión anterior de la clase, como se puede ver en las revisiones realizadas en 2010 . De hecho, 181783497276652981L
parece ser un error tipográfico y podría presentar un informe de error.
seedUniquifier
puede ser extremadamente competitivo en una caja de 64 núcleos. Un subproceso local habría sido más escalable.