왜 한 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()시드 매개 변수없이 호출 하면 현재 "시드 고유 식"을 취하고이를 System.nanoTime(). 그런 181783497276652981다음 다음 번에 저장할 또 다른 시드 고유 식을 생성 하는 데 사용 합니다 new Random().
181783497276652981L및 리터럴 8682522807148012L은 상수에 배치되지 않지만 다른 곳에 나타나지 않습니다.
처음에 댓글은 나에게 쉬운 리드를 제공합니다. 해당 기사를 온라인으로 검색 하면 실제 기사가 나옵니다 . 8682522807148012신문에 나타나지 않지만 181783497276652981나타나지 않습니다 - 다른 번호의 문자열로 1181783497276652981하고, 181783497276652981로모그래퍼 1앞에 추가.
이 논문 1181783497276652981은 선형 합동 생성기에 대해 좋은 "장점"을 산출하는 숫자라고 주장합니다 . 이 번호가 단순히 Java로 잘못 복사 되었습니까? 않습니다 181783497276652981허용 장점을 가지고?
그리고 왜 8682522807148012선택 되었습니까?
두 번호를 온라인으로 검색하면 아무런 설명 만 얻을 수없는 페이지 도 떨어 통지 1의 앞을 181783497276652981.
이 두 숫자만큼 잘 작동 할 다른 숫자를 선택할 수 있습니까? 그 이유는 무엇?
86825228071480122010 년 개정판에서 볼 수 있듯이 이전 버전 클래스의 레거시입니다 . 는 181783497276652981L실제로 오타 것 같다 당신은 버그보고를 할 수있다.
seedUniquifier64 코어 박스에서 극도로 경쟁 할 수 있습니다. 스레드 로컬이 더 확장 가능했을 것입니다.

