Tại sao 181783497276652981
và 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ự 181783497276652981L
và 8682522807148012L
khô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ự . 8682522807148012
không xuất hiện trên giấy, nhưng 181783497276652981
xuất hiện - dưới dạng một chuỗi con của một số khác,1181783497276652981
mà là 181783497276652981
với một 1
prepended.
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ó 181783497276652981
mộ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?
8682522807148012
là 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ó 181783497276652981L
vẻ 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.
seedUniquifier
có 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.