Perché sono stati scelti 181783497276652981e 8682522807148012scelti 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 181783497276652981per creare un altro uniquificatore seme da memorizzare per la prossima volta che new Random()viene chiamato.
I letterali 181783497276652981Le 8682522807148012Lnon 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 . 8682522807148012non appare nel foglio, ma 181783497276652981appare come sottostringa di un altro numero 1181783497276652981, che è 181783497276652981con 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 181783497276652981un merito accettabile?
E perché è stato 8682522807148012scelto?
La ricerca in linea di uno dei numeri non fornisce alcuna spiegazione, solo questa pagina che nota anche la caduta 1di 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' 181783497276652981Lsembra essere un errore di battitura davvero e si potrebbe presentare un bug report.
seedUniquifierpuò diventare estremamente conteso su una scatola a 64 core. Un thread-local sarebbe stato più scalabile.

