Почему были 181783497276652981и 8682522807148012выбраны Random.java?
Вот соответствующий исходный код из 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()без какого-либо начального параметра берется текущий «начальный унификатор» и выполняется XOR с ним System.nanoTime(). Затем он использует 181783497276652981для создания другого уникального начального значения, которое будет сохранено для следующего вызова new Random().
Литералы 181783497276652981Lи 8682522807148012Lне помещаются в константы, но больше нигде не встречаются.
Сначала комментарий дает мне легкую зацепку. Поиск этой статьи в Интернете дает саму статью . 8682522807148012не появляется в работе, но 181783497276652981действительно появляется - как подстроки другого числа, 1181783497276652981, что 181783497276652981с 1префиксом.
В статье утверждается, что 1181783497276652981это число дает хорошие «достоинства» линейного конгруэнтного генератора. Этот номер просто неправильно скопировали в Java? Есть ли 181783497276652981приемлемые достоинства?
А почему был 8682522807148012выбран?
Поиск в Интернете любого числа не дает никаких объяснений, только эта страница, которая также замечает выпавшее 1впереди 181783497276652981.
Могли ли быть выбраны другие числа, которые работали бы так же хорошо, как эти два числа? Почему или почему нет?
8682522807148012является наследием предыдущей версии класса, как видно из изменений, внесенных в 2010 году . 181783497276652981L, Кажется, опечатка , действительно , и вы можете подать отчет об ошибке.
seedUniquifierна 64-ядерном ящике может быть очень много. Локальный поток был бы более масштабируемым.

