Mengapa 181783497276652981
dan 8682522807148012
dipilih 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 181783497276652981
untuk membuat pengunikan benih lain untuk disimpan untuk panggilan berikutnya new Random()
.
Literal 181783497276652981L
dan 8682522807148012L
tidak 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 . 8682522807148012
tidak muncul di koran, tapi 181783497276652981
tidak muncul - sebagai substring dari nomor lain, 1181783497276652981
yang 181783497276652981
dengan 1
ditambahkan.
Makalah ini mengklaim bahwa itu 1181783497276652981
adalah angka yang menghasilkan "jasa" yang baik untuk generator kongruensial linier. Apakah nomor ini salah disalin ke dalam Java? Apakah 181783497276652981
memiliki pahala yang dapat diterima?
Dan mengapa 8682522807148012
dipilih?
Pencarian online untuk salah satu nomor tidak menghasilkan penjelasan, hanya halaman ini yang juga mengetahui penurunan 1
di depan 181783497276652981
.
Mungkinkah nomor lain telah dipilih yang berfungsi sebaik kedua nomor ini? Mengapa atau mengapa tidak?
8682522807148012
merupakan warisan dari versi kelas sebelumnya, seperti yang dapat dilihat pada revisi yang dibuat pada tahun 2010 . The 181783497276652981L
tampaknya menjadi salah ketik memang dan Anda bisa mengajukan laporan bug.
seedUniquifier
dapat sangat dipertandingkan pada kotak 64 inti. Thread-local akan lebih terukur.