2013-08-26 2 views
0

더 이상 문제가 없지만 일부 코드의 동작을 이해하고 싶습니다. 처음에는 임의의 숫자를 생성하고 Math.random이 모든 반복에 대해 동일한 숫자를 반환하는 코드에서 어딘가에 생성했습니다.static Math.random change java

첫 번째 클래스 :

public class randomTest { 


public randomTest() 
    { } 
    public double generateRandomNumber() 
    { 
     double r = Math.random(); 
     return r; 
    } 
    public static void main(String args[]) 
    { 
     randomTest t = new randomTest(); 
     for (int i = 0; i < 10; i++) 
      System.out.println(t.generateRandomNumber()); 
    }  
} 

두 번째 클래스 : 나는 최소한의 코드 예제를 생성하기 위해 노력했다

public class anotherClass { 
    private randomTest t = new randomTest(); 

    public static void main(String args[]) 
    { 

     for (int i = 0; i < 10; i++) 
     { 
      anotherClass c = new anotherClass(); 
      System.out.println(c.t.generateRandomNumber()); 
     } 

    } 
} 

을 추적하는 나는 다음과 같은 두 가지 클래스와 최소한의 예제를 만들려고 왜 항상 전체 10 반복에 대해 동일한 임의의 값을 얻는 지에 대한 이유입니다. 이 최소 예에서는 결과가 정확하고 무작위입니다. 그러나 실제 상황에서는 두 번째 클래스의 출력이 전체 10 번의 반복에 대해 동일합니다.

마침내 정적 메서드로 호출하는 메서드를 변경하여 문제를 해결할 수있었습니다. 나는 아직도이 문제가 어떻게 내 문제를 해결했는지, 그리고 원래의 문제가 어디에 있는지 이해하지 못한다.

올드 휴무 코드 :

... 
public ImagePlus createAnImage() 
{ 
    drawBackground(c.ip); 

    width = ip.getWidth(); 
    height =ip.getHeight(); 
    createCircles(requiredCircles); // this is not creating random numbers 
    ArrayList<Circle> list = circlesList; 
    drawBoundaries(list, ip, percentage); 
    background.setProcessor(ip); 

    return background;   
} 
... 

새로운 코드 : 다음과 같이 이미 다른 클래스에서 createCircles 클래스의 인스턴스를 생성 한 두 경우 모두

... 
public static ImagePlus createAnImage() 
{ 
    createCircles c = new createCircles(); 
    c.drawBackground(c.ip); 

    c.width = c.ip.getWidth(); 
    c.height =c.ip.getHeight(); 
    c.createCircles(c.requiredCircles); // this is creating random numbers 
    ArrayList<Circle> list = c.circlesList; 
    c.drawBoundaries(list, c.ip, c.percentage); 
    c.background.setProcessor(c.ip); 

    return c.background;   
} 
... 

:

... 
private ImagePlus createRandomImage(int radius, int numberOfCircles, double minPercentage, double maxPercentage, int minBackground, int maxBackground) 
{ 
    // create the image using class createCircles 
    createCircles c = new createCircles(); 
    c.setParameters(radius, radius, minBackground, maxBackground, numberOfCircles, imageWidth, imageHeight, minPercentage, maxPercentage); 
    ImagePlus imp = c.createAnImage(); // calling the static method works 

    return imp;    
} 

내 문제가 해결되었지만, 나는 아직도이 배경의 이유를 이해할 필요가있다. 나는 정적 대 비 정적 방법에 대해 더 잘 이해할 수 있다고 생각한다. 누구나 단서가 있습니까?

최고 감사합니다, M. Tleis는

답변

1

수학을 사용하지 마십시오. random

, 단일 랜덤를 사용해야 단위로 임의 일련의 숫자를 생성하려면 0 N.

사이의 임의의 정수를 생성하는 Random 클래스를 사용 (이 복식이 아닌 정수를 생산) object - 각 새로운 난수에 대해 새로운 Random 객체를 만들지 않습니다.

import java.util.Random; 

/** Generate 10 random integers in the range 0..99. */ 
public final class RandomInteger { 

    public static final void main(String... aArgs){ 
    log("Generating 10 random integers in range 0..99."); 

    //note a single Random object is reused here 
    Random randomGenerator = new Random(); 
    for (int idx = 1; idx <= 10; ++idx){ 
     int randomInt = randomGenerator.nextInt(100); 
     log("Generated : " + randomInt); 
    } 

    log("Done."); 
    } 

    private static void log(String aMessage){ 
    System.out.println(aMessage); 
    } 
}