2010-11-23 2 views
13

Java의 Random generator를 사용하여 nextInt로 숫자를 생성하면 숫자가 균등하게 분배됩니다. 그러나 랜덤 클래스 두 개를 사용하여 두 랜덤 클래스로 숫자를 생성하면 어떻게됩니까? 숫자는 균등하게 분배 되나요? 아닙니다.무작위 분포의 균일 분포

답변

7

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()); } 

,이 중 자신을 돌봐해야합니다. 가능한 한 가지 방법은 난수 생성기를 사용하여 다른 모든 생성기의 시드를 생성하는 것입니다.

+0

' 휘발성 '이란 원자가 된 피부 여자는 아니다. –

+0

@ J-16 : 자바 1.5에서 소개 된 새로운 자바 메모리 모델이 보장된다고 본다. (http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#volatile). 어쨌든 이것은 내 코드가 아닙니다. java.util.Random의 내부 구현입니다. – Grodriguez

+0

JMM에서 'long'은 '휘발성'또는 '불 휘발성'을 표시하는지 여부와 관계없이 항상 원자 적입니다. (반값으로 쓰여진 값은 결코 볼 수 없습니다.) 원자가 아닌 (휘발성과 상관없이) 읽기 & 증가 및 쓰기 길다. 따라서 여러 스레드가 변수를 모두 '0'(예 :)으로 읽는 것이 가능하며, 모두 값을 '1'로 증분하고 모두 변수에 '1'을 다시 씁니다. 카운터를 100 % 신뢰할 수있게 액세스 당 한 번씩 증가 시키려면 동기화가 필요합니다. AtomicLong과 같은'java.util.concurrent.atomic' 클래스는 이것을 쉽고 정확합니다. –

8

두 값 모두 같은 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에 실행에서 분포의 산포도이다

alt text

및 여기에 단일 RNG 실행의 분포 2000 번호는 총 발생 :이 유한 집합을 통해 높은 품질의 이산 균일 한 분포를 생산 접근하는 매우 분명한 것 같다

alt text

.

고품질 무작위성을 찾고 있다면 같은 종자를 가진 두 개의 RNG를 시드하는 것이 좋지 않다는 것을 거의 모두 알고 있습니다. 그러나이 경우 우리는 이 각각의 RNG가 독립적으로 상당히 높은 품질의 임의성을 방출하는 시나리오를 만들었지 만 출력을 결합하면 품질이 떨어집니다 (이산은 적음).

+1

질문에 대한 질문에 대답합니다. –

+0

당신 말이 맞지만이 경우에도 결과 분포는 ** 균일합니다. – Grodriguez

+0

@ Grodriguez 음모가 잘못된 것일 수 있습니다. 첫 번째 분산 형 플롯에서 각 점은 실제로 2 점이 정확히 겹치는 점을 기억하십시오. 시각적으로 차트 1은 차트 2보다 적은 수의 샘플로 균일하게 나타납니다. 그러나 실제로 두 차트 모두 동일한 수의 샘플을 가지며, 두 번째 차트보다 무작위로 덜 배치됩니다. 적어도, 그렇게 생각합니다. Chi Squared Test가 결과에 대해 말할 수 있을지 궁금합니다. –