Dlaczego 181783497276652981i 8682522807148012dobrane Random.java?
Oto odpowiedni kod źródłowy z 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);
Tak więc, wywołanie new Random()bez żadnego parametru ziarna pobiera bieżący "identyfikator zarodka" i wykonuje go XOR System.nanoTime(). Następnie używa 181783497276652981do utworzenia kolejnego identyfikatora nasion, który ma być przechowywany na następny raz new Random().
Literały 181783497276652981Li 8682522807148012Lnie są umieszczane w stałych, ale nie pojawiają się nigdzie indziej.
Na początku komentarz daje mi łatwy trop. Wyszukiwanie tego artykułu w Internecie powoduje wyświetlenie faktycznego artykułu . 8682522807148012nie pojawiają się na papierze, ale 181783497276652981wydaje - jako podciąg inny numer 1181783497276652981, który jest 181783497276652981z 1poprzedzany.
Artykuł twierdzi, że 1181783497276652981jest to liczba, która daje dobrą „zasługę” dla liniowego generatora kongruencjalnego. Czy ten numer został po prostu nieprawidłowo skopiowany do Javy? Czy 181783497276652981ma akceptowalną wartość?
A dlaczego został 8682522807148012wybrany?
Wyszukiwanie w Internecie dla dowolnego numeru nie daje żadnego wyjaśnienia, tylko ta strona, która również odnotowuje spadek 1przed 181783497276652981.
Czy można było wybrać inne liczby, które działałyby równie dobrze jak te dwie liczby? Dlaczego lub dlaczego nie?
8682522807148012jest spuścizną poprzedniej wersji klasy, co widać w rewizjach dokonanych w 2010 roku . 181783497276652981LWydaje się być rzeczywiście literówkę i można to zgłosić.
seedUniquifiermoże być niezwykle wytrzymały na skrzynce z 64 rdzeniami. Lokalny wątek byłby bardziej skalowalny.

