0

もう問題はありませんが、コードの動作を理解したいです。最初、私はいくつかの乱数を生成していましたが、コードのどこかで Math.random がすべての反復に対して同じ数を返していました。次の 2 つのクラスで最小限の例を作成しようとしました。

ファーストクラス:

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

2 番目のクラス:

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回の反復全体で常に同じランダム値を取得する理由を追跡するために、最小限のコード例を生成しようとしていました. この最小限の例では、結果は正しくランダムですが、私の実際の状況では、2 番目のクラスの出力は 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;        
}
...

新しいコード:

...
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;        
}
...

どちらの場合も、次のように別のクラスから createCircles クラスのインスタンスを作成していました。

...
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

4

1 に答える 1

1

数学は使用しないでください。ランダム(整数ではなく倍精度を生成します)

Randomクラスを使用して、0 から N までのランダムな整数を生成します。

一連の乱数を 1 つの単位として生成するには、単一の Random オブジェクトを使用する必要があります。新しい乱数ごとに新しい 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);
  }
}
于 2013-08-26T10:13:43.320 に答える