Почему были 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
.
Были ли выбраны другие числа, которые бы работали так же хорошо, как эти два числа? Почему или почему нет?