Dlaczego 181783497276652981
i 8682522807148012
dobrane 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 181783497276652981
do utworzenia kolejnego identyfikatora nasion, który ma być przechowywany na następny raz new Random()
.
Literały 181783497276652981L
i 8682522807148012L
nie 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 . 8682522807148012
nie pojawiają się na papierze, ale 181783497276652981
wydaje - jako podciąg inny numer 1181783497276652981
, który jest 181783497276652981
z 1
poprzedzany.
Artykuł twierdzi, że 1181783497276652981
jest to liczba, która daje dobrą „zasługę” dla liniowego generatora kongruencjalnego. Czy ten numer został po prostu nieprawidłowo skopiowany do Javy? Czy 181783497276652981
ma akceptowalną wartość?
A dlaczego został 8682522807148012
wybrany?
Wyszukiwanie w Internecie dla dowolnego numeru nie daje żadnego wyjaśnienia, tylko ta strona, która również odnotowuje spadek 1
przed 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?
8682522807148012
jest spuścizną poprzedniej wersji klasy, co widać w rewizjach dokonanych w 2010 roku . 181783497276652981L
Wydaje się być rzeczywiście literówkę i można to zgłosić.
seedUniquifier
może być niezwykle wytrzymały na skrzynce z 64 rdzeniami. Lokalny wątek byłby bardziej skalowalny.