Чому їх 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-ядерної коробки. Місцева нитка була б більш масштабованою.

