Tại sao 181783497276652981và 8682522807148012được chọn trong Random.java?
Đây là mã nguồn có liên quan từ 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);
Vì vậy, việc gọi new Random()mà không có bất kỳ tham số hạt giống nào sẽ nhận "seed uniquifier" hiện tại và XOR nó với System.nanoTime(). Sau đó, nó sử dụng 181783497276652981để tạo một seed uniquifier khác để lưu trữ cho lần sau new Random()được gọi.
Các ký tự 181783497276652981Lvà 8682522807148012Lkhông được đặt trong hằng số, nhưng chúng không xuất hiện ở bất kỳ nơi nào khác.
Lúc đầu, nhận xét cho tôi một hướng dẫn dễ dàng. Tìm kiếm trực tuyến cho bài viết đó cho ra bài viết thực sự . 8682522807148012không xuất hiện trên giấy, nhưng 181783497276652981xuất hiện - dưới dạng một chuỗi con của một số khác,1181783497276652981 mà là 181783497276652981với một 1prepended.
Bài báo tuyên bố rằng 1181783497276652981 là một con số mang lại "giá trị" tốt cho một máy phát đồng dư tuyến tính. Con số này có phải đã được sao chép sai vào Java không? Có 181783497276652981một công trạng chấp nhận được không?
Và tại sao 8682522807148012 chọn?
Tìm kiếm trực tuyến cho một trong hai số không có lời giải thích nào, chỉ có trang này cũng thông báo số đã giảm 1ở phía trước 181783497276652981.
Có thể các số khác đã được chọn sẽ hoạt động tốt như hai số này? Tại sao hoặc tại sao không?
8682522807148012là kế thừa của phiên bản trước của lớp, như có thể thấy trong các bản sửa đổi được thực hiện vào năm 2010 . Có 181783497276652981Lvẻ như thực sự là một lỗi đánh máy và bạn có thể gửi một báo cáo lỗi.
seedUniquifiercó thể trở nên cực kỳ cạnh tranh trên hộp 64 lõi. Một luồng cục bộ sẽ có thể mở rộng hơn.

