2013-02-14 2 views
5

Java와 matlab의 mersenne 트위스터를 비교하고 있습니다. 둘 다 같은 씨앗을 사용하고 있습니다. 제 문제는 각 숫자 생성기 (Java 및 Matlab에서 각각 실행중인 Mersenne Twister)에서 10 개의 숫자를 인쇄 할 때 출력 결과가 일치하지 않는 것입니다. Matlab 버전의 출력 데이터는 Java의 프로그램에서 매초마다 인쇄됩니다.Java와 matlab의 Mersenne Twister 비교

자바 인쇄 :

0.417, 0.997, 0.720, 0.932, 0.0001 ..

matlab에 인쇄 :

0.417, 0.720, 0.0001 ..

누구나 올바른 방향으로 나를 가리켜 주셔서 왜이게 뭐야?

는 자바 :

public class TestRand { 
    static MersenneTwister r = new MersenneTwister(1); 

    public static void main(String[] args) { 

     int ant = 10; 
     float[] randt = new float[ant]; 

     for (int i = 0; i < ant; i++){ 
      randt[i] = r.nextFloat()*1; 
      System.out.println(randt[i]);  
     } 
     System.out.println("------------twist"); 
    } 
} 

matlab에 : 나는 매트랩에서 메르 센 트위스터의 표준 구현을 사용하고

s = RandStream('twister','Seed',1) 
RandStream.setGlobalStream(s); 

r = 1 .* rand(1,10); 

, 내가 사용하고있는 자바 버전을 찾을 수 있습니다 here

+0

자바 구현을 어디서 얻었습니까? –

+1

다른 시퀀스를 생성하는 Mersenne Twister의 32 비트 및 64 비트 변형이 있습니다. Java는 하나를 사용하고 Matlab은 다른 것일 수 있습니다. – DNA

+0

죄송합니다. 초기 게시물에서 그 정보를 간과 한 것 같았습니다. 이제 업데이트되었습니다. Java 버전은 [여기] (http://www.cs.gmu.edu/~sean/research/mersenne/MersenneTwister.java)입니다. – user2072220

답변

2

Matlab rand() 결과는 64 비트 double 값입니다. 그러나 자바 MersenneTwister에서 32 비트 값을 얻으려면 nextFloat()을 호출해야합니다. Java 소스 인 nextDoublenextFloat의 두 배의 무작위성을 사용하는지 확인하고 두 번의 호출은 next()입니다. TestRand 자바 코드에 nextFloat()nextDouble()으로 대체하면 검색 결과가 더 잘 정렬됩니다.

관련 문제