Java의 Random generator를 사용하여 nextInt로 숫자를 생성하면 숫자가 균등하게 분배됩니다. 그러나 랜덤 클래스 두 개를 사용하여 두 랜덤 클래스로 숫자를 생성하면 어떻게됩니까? 숫자는 균등하게 분배 되나요? 아닙니다.무작위 분포의 균일 분포
답변
Random
인스턴스별로 생성 된 숫자는 균등하게 분포하므로 Random
인스턴스에서 생성 된 난수 시퀀스를 결합하면 균일하게 분포해야합니다.
결과 분포가 균일해도 시드에주의를 기울여 두 생성자의 출력 간의 상관 관계를 피할 수 있습니다. 기본 no-arg 생성자를 사용하면 시드가 이미 달라져야합니다. java.util.Random
의 소스 코드에서 :
Random(long seed)
생성자를 사용하거나
setSeed(long seed)
를 호출하여) 명시 적으로 씨앗을 설정하는 경우
private static volatile long seedUniquifier = 8682522807148012L;
public Random() { this(++seedUniquifier + System.nanoTime()); }
,이 중 자신을 돌봐해야합니다. 가능한 한 가지 방법은 난수 생성기를 사용하여 다른 모든 생성기의 시드를 생성하는 것입니다.
두 값 모두 같은 Random
인스턴스에 시드를 지정하면 분명히 양질의 균일 한 균일 분포를 얻지 못할 것입니다.
public class RngTest2 {
public static void main(String[] args) throws Exception {
long currentTime = System.currentTimeMillis();
Random r1 = new Random(currentTime);
Random r2 = new Random(currentTime);
System.out.println(r1.nextInt());
System.out.println(r2.nextInt());
}
}
을하지만 그것은 단지 하나의 반복이다 : 말 그대로 두 번 동일한 번호를 인쇄 가장 기본적인 경우를 고려 (... 훨씬 적은 임의보다하지 않음). 샘플 크기를 크랭크 업하기 시작하면 어떻게됩니까? 여기
숫자 전체 나란히 2000을 생성하는 두 개의 동일한 시드 RNG에 실행에서 분포의 산포도이다및 여기에 단일 RNG 실행의 분포 2000 번호는 총 발생 :이 유한 집합을 통해 높은 품질의 이산 균일 한 분포를 생산 접근하는 매우 분명한 것 같다
.
고품질 무작위성을 찾고 있다면 같은 종자를 가진 두 개의 RNG를 시드하는 것이 좋지 않다는 것을 거의 모두 알고 있습니다. 그러나이 경우 우리는 에이 각각의 RNG가 독립적으로 상당히 높은 품질의 임의성을 방출하는 시나리오를 만들었지 만 출력을 결합하면 품질이 떨어집니다 (이산은 적음).
질문에 대한 질문에 대답합니다. –
당신 말이 맞지만이 경우에도 결과 분포는 ** 균일합니다. – Grodriguez
@ Grodriguez 음모가 잘못된 것일 수 있습니다. 첫 번째 분산 형 플롯에서 각 점은 실제로 2 점이 정확히 겹치는 점을 기억하십시오. 시각적으로 차트 1은 차트 2보다 적은 수의 샘플로 균일하게 나타납니다. 그러나 실제로 두 차트 모두 동일한 수의 샘플을 가지며, 두 번째 차트보다 무작위로 덜 배치됩니다. 적어도, 그렇게 생각합니다. Chi Squared Test가 결과에 대해 말할 수 있을지 궁금합니다. –
- 1. Matlab의 이진 값의 균일 분포
- 2. 큰 무작위 평면 그래프 생성
- 3. tr1을 사용하여 비 균일 한 정수 분포 생성
- 4. 알 수없는 확률 분포의 샘플
- 5. 균일 한 분포를 갖는 무작위 가변 길이 인코딩 된 숫자
- 6. 정규 분포의 * 부분 *에 대한 알고리즘
- 7. 특정 비 균일 분포를 갖는 의사 난수 생성
- 8. R 정규 분포의 피팅 R
- 9. 비 균일 랜덤 화자
- 10. 이항 분포 시뮬레이션
- 11. 비 균일 난수 생성기
- 12. mathematica에서 분포 생성하기
- 13. C++ : 가우스 분포 생성
- 14. FreeBSD 대역폭 분포
- 15. 참조의 균일 한 초기화
- 16. 비 균일 난수 생성
- 17. 파이썬의 지수 분포
- 18. 부스트에서 감마 분포
- 19. Java 정규 분포
- 20. 균일 한 정수 분배기
- 21. 3D 모델의 균일 샘플링
- 22. Python의 확률 분포 함수
- 23. MATLAB : 빈도 분포
- 24. MySQL의 표준 분포 계산
- 25. 지수가 없거나 GF (2^M)의 경계가있는 균일 무작위 값 선택하기
- 26. 무작위 값을 기준으로 필터링하여 목록 이해력을 사용하여 균일하게 분포 된 임의의 부동 소수점을 생성합니다.
- 27. C++ 0x 균일 초기화 "oddity"
- 28. 바이 모달 분포 특성화 알고리즘?
- 29. 비 균일 분산 랜덤 배열
- 30. 랜덤 색상 편차 정규 분포
' 휘발성 '이란 원자가 된 피부 여자는 아니다. –
@ J-16 : 자바 1.5에서 소개 된 새로운 자바 메모리 모델이 보장된다고 본다. (http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#volatile). 어쨌든 이것은 내 코드가 아닙니다. java.util.Random의 내부 구현입니다. – Grodriguez
JMM에서 'long'은 '휘발성'또는 '불 휘발성'을 표시하는지 여부와 관계없이 항상 원자 적입니다. (반값으로 쓰여진 값은 결코 볼 수 없습니다.) 원자가 아닌 (휘발성과 상관없이) 읽기 & 증가 및 쓰기 길다. 따라서 여러 스레드가 변수를 모두 '0'(예 :)으로 읽는 것이 가능하며, 모두 값을 '1'로 증분하고 모두 변수에 '1'을 다시 씁니다. 카운터를 100 % 신뢰할 수있게 액세스 당 한 번씩 증가 시키려면 동기화가 필요합니다. AtomicLong과 같은'java.util.concurrent.atomic' 클래스는 이것을 쉽고 정확합니다. –