Perché sono stati scelti 181783497276652981
e 8682522807148012
scelti Random.java
?
Ecco il codice sorgente pertinente da 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);
Quindi, invocare new Random()
senza alcun parametro seed prende l'attuale "seed uniquifier" e lo XOR con System.nanoTime()
. Quindi utilizza 181783497276652981
per creare un altro uniquificatore seme da memorizzare per la prossima volta che new Random()
viene chiamato.
I letterali 181783497276652981L
e 8682522807148012L
non sono inseriti in costanti, ma non appaiono da nessun'altra parte.
All'inizio il commento mi dà un facile vantaggio. La ricerca in linea di quell'articolo produce l'articolo vero e proprio . 8682522807148012
non appare nel foglio, ma 181783497276652981
appare come sottostringa di un altro numero 1181783497276652981
, che è 181783497276652981
con a1
preposto.
L'articolo afferma che 1181783497276652981
è un numero che fornisce un buon "merito" per un generatore congruente lineare. Questo numero è stato semplicemente copiato erroneamente in Java? Ha 181783497276652981
un merito accettabile?
E perché è stato 8682522807148012
scelto?
La ricerca in linea di uno dei numeri non fornisce alcuna spiegazione, solo questa pagina che nota anche la caduta 1
di fronte 181783497276652981
.
Si sarebbero potuti scegliere altri numeri che avrebbero funzionato come questi due numeri? Perché o perché no?
8682522807148012
è un'eredità della versione precedente della classe, come si può vedere nelle revisioni effettuate nel 2010 . L' 181783497276652981L
sembra essere un errore di battitura davvero e si potrebbe presentare un bug report.
seedUniquifier
può diventare estremamente conteso su una scatola a 64 core. Un thread-local sarebbe stato più scalabile.