Почему были 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-ядерном ящике может быть очень много. Локальный поток был бы более масштабируемым.