Warum wurden 181783497276652981
und 8682522807148012
ausgewä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 181783497276652981
ein weiterer Seed-Uniquifier erstellt, der beim nächsten Aufruf gespeichert werden new Random()
soll.
Die Literale 181783497276652981L
und 8682522807148012L
werden 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 . 8682522807148012
erscheint nicht im Papier, sondern 181783497276652981
erscheint - als Teilzeichenfolge einer anderen Zahl 1181783497276652981
, die 181783497276652981
mit einem 1
vorangestellten Zeichen versehen ist.
Das Papier behauptet, dass dies 1181783497276652981
eine Zahl ist, die einen guten "Verdienst" für einen linearen Kongruenzgenerator ergibt. Wurde diese Nummer einfach falsch in Java kopiert? Hat 181783497276652981
ein akzeptables Verdienst?
Und warum wurde 8682522807148012
gewählt?
Die Online-Suche nach einer der beiden Nummern liefert keine Erklärung, nur diese Seite , auf der auch das vorangestellte Feld 1
angezeigt wird 181783497276652981
.
Könnten andere Nummern gewählt worden sein, die genauso gut funktioniert hätten wie diese beiden Nummern? Warum oder warum nicht?
8682522807148012
ist ein Erbe der vorherigen Version der Klasse, wie aus den 2010 vorgenommenen Überarbeitungen hervorgeht . Das 181783497276652981L
scheint in der Tat ein Tippfehler zu sein und Sie könnten einen Fehlerbericht einreichen.
seedUniquifier
kann auf einer 64-Core-Box extrem umstritten sein. Ein Thread-Local wäre skalierbarer gewesen.