Mengapa 181783497276652981dan 8682522807148012dipilih Random.java?
Berikut kode sumber yang relevan dari 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);
Jadi, memanggil new Random()tanpa parameter seed apapun membutuhkan "seed uniquifier" saat ini dan melakukan XOR dengannya System.nanoTime(). Kemudian menggunakan 181783497276652981untuk membuat pengunikan benih lain untuk disimpan untuk panggilan berikutnya new Random().
Literal 181783497276652981Ldan 8682522807148012Ltidak ditempatkan dalam konstanta, tetapi tidak muncul di tempat lain.
Awalnya komentar itu memberi saya petunjuk mudah. Pencarian online untuk artikel itu menghasilkan artikel yang sebenarnya . 8682522807148012tidak muncul di koran, tapi 181783497276652981tidak muncul - sebagai substring dari nomor lain, 1181783497276652981yang 181783497276652981dengan 1ditambahkan.
Makalah ini mengklaim bahwa itu 1181783497276652981adalah angka yang menghasilkan "jasa" yang baik untuk generator kongruensial linier. Apakah nomor ini salah disalin ke dalam Java? Apakah 181783497276652981memiliki pahala yang dapat diterima?
Dan mengapa 8682522807148012dipilih?
Pencarian online untuk salah satu nomor tidak menghasilkan penjelasan, hanya halaman ini yang juga mengetahui penurunan 1di depan 181783497276652981.
Mungkinkah nomor lain telah dipilih yang berfungsi sebaik kedua nomor ini? Mengapa atau mengapa tidak?
8682522807148012merupakan warisan dari versi kelas sebelumnya, seperti yang dapat dilihat pada revisi yang dibuat pada tahun 2010 . The 181783497276652981Ltampaknya menjadi salah ketik memang dan Anda bisa mengajukan laporan bug.
seedUniquifierdapat sangat dipertandingkan pada kotak 64 inti. Thread-local akan lebih terukur.

