Warum wurden 181783497276652981und 8682522807148012ausgewählt Random.java?
Hier ist der relevante Quellcode aus 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);
new Random()Wenn Sie also ohne einen Seed-Parameter aufrufen, wird der aktuelle "Seed Uniquifier" verwendet und mit XORs versehen System.nanoTime(). Anschließend wird 181783497276652981ein weiterer Seed-Uniquifier erstellt, der beim nächsten Aufruf gespeichert werden new Random()soll.
Die Literale 181783497276652981Lund 8682522807148012Lwerden nicht in Konstanten platziert, aber sie erscheinen nirgendwo anders.
Der Kommentar gibt mir zunächst einen einfachen Hinweis. Wenn Sie online nach diesem Artikel suchen, erhalten Sie den tatsächlichen Artikel . 8682522807148012erscheint nicht im Papier, sondern 181783497276652981erscheint - als Teilzeichenfolge einer anderen Zahl 1181783497276652981, die 181783497276652981mit einem 1vorangestellten Zeichen versehen ist.
Das Papier behauptet, dass dies 1181783497276652981eine Zahl ist, die einen guten "Verdienst" für einen linearen Kongruenzgenerator ergibt. Wurde diese Nummer einfach falsch in Java kopiert? Hat 181783497276652981ein akzeptables Verdienst?
Und warum wurde 8682522807148012gewählt?
Die Online-Suche nach einer der beiden Nummern liefert keine Erklärung, nur diese Seite , auf der auch das vorangestellte Feld 1angezeigt wird 181783497276652981.
Könnten andere Nummern gewählt worden sein, die genauso gut funktioniert hätten wie diese beiden Nummern? Warum oder warum nicht?
8682522807148012ist ein Erbe der vorherigen Version der Klasse, wie aus den 2010 vorgenommenen Überarbeitungen hervorgeht . Das 181783497276652981Lscheint in der Tat ein Tippfehler zu sein und Sie könnten einen Fehlerbericht einreichen.
seedUniquifierkann auf einer 64-Core-Box extrem umstritten sein. Ein Thread-Local wäre skalierbarer gewesen.

