2013-04-29 4 views
7

나는 그가 프로그램을 실행할 때마다 똑같은 숫자를 계속해서 얻었을 때 자바의 난수 생성기를 친구에게 설명하려고 노력했다. 나는 똑같은 간단한 버전을 만들었고 프로그램을 실행할 때마다 똑같은 숫자를 얻고 있습니다.Java 임의의 숫자가 무작위가 아닌가요?

내가 뭘 잘못하고 있니? 100 중

import java.util.*; 

public class TestCode{ 
    public static void main(String[] args){ 
     int sum = 0; 
     Random rand = new Random(100); 
     for(int x = 0; x < 100; x++){ 
      int num = (rand.nextInt(100)) + 1; 
      sum += num; 
      System.out.println("Random number:" + num); 
     } 
     //value never changes with repeated program executions. 
     System.out.println("Sum: " + sum); 
    } 

} 

마지막 다섯 개 번호는 다음과 같습니다

40 
60 
27 
56 
53 
+1

는 더 좋은 방법이 사용 인 Math.random()입니다. – Gere

+6

무작위 인스턴스를 생성 할 때 상수 시드를 사용하고 있습니다. 물론 같은 번호를 얻을 수 있습니다. –

+3

@Gere :'Math.random()'에 대해서 왜 그렇게 환상적이며, 무작위 인스턴스를 사용하는 것보다 낫지 않습니까? –

답변

23

당신은 일정한 값 100으로 임의의 발전기를 접종했다. 결정 론적이므로 각 실행마다 동일한 값이 생성됩니다.

100으로 시드를 선택한 이유는 확실하지 않지만 시드 값은 생성 된 값의 범위와 아무 관련이 없습니다 (다른 수단 (예 : nextInt)에 대한 호출과는 아무런 관련이 없습니다. 있다).

매번 다른 값을 얻으려면 시스템 시간을 사용하여 임의 생성기를 시드하는 인수없이 Random 생성자를 사용하십시오.

매개 변수가없는 Random 생성자의 자바 독에서 인용 :

새로운 난수 생성기를 작성합니다. 이 생성자는 난수 생성 프로그램의 시드 을이 생성자의 다른 호출에서 구별 될 가능성이 높은 값인 으로 설정합니다. 매개 변수가없는 Random 생성자에서 실제 코드를 인용

:

public Random() { 
    this(seedUniquifier()^System.nanoTime()); 
} 
2

이 : 당신은 난수 생성기에 동일한 씨앗 (100) 당신이 시작할 때마다 제공하고

Random rand = new Random(100); 

프로그램. System.currentTimeMillis()의 출력과 같이 입력하면 각 호출마다 다른 번호가 제공됩니다.

1

난수 생성기는 실제로는 의사 난수입니다. 즉, 결정 론적 수단을 사용하여 특정 통계 기준에 따라 임의로 나타나는 시퀀스를 생성합니다.

constactctor를 사용하면 의사 난수 시퀀스를 결정하는 시드를 전달할 수 있습니다. 내 생각이 도움이

0

희망 ..

Random r = new Random(System.currentTimeMillis()); 
double[] rand = new double[500]; 
for(int i=0;i<100;i++){ 
    rand[i] = r.nextDouble(); 
    //System.out.print(rand[i] + "\n"); 
} 
//System.out.println(); 
return rand[randomInt]; 
관련 문제