0

我没有问题了,但是我想了解一些代码的行为。最初,我生成了一些随机数,并且在我的代码中的某个地方,Math.random 为所有迭代返回了相同的数字。我尝试使用以下两个类创建一个最小示例:

头等舱:

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 次迭代中总是获得相同的随机值的原因。在这个最小的例子中,结果是正确和随机的,但是在我的真实情况下,第二类的输出对于整个十次迭代都是相同的。

最后我能够通过将我调用的方法更改为静态方法来解决问题。我仍然不明白这如何解决我的问题,以及最初的问题在哪里。

旧的非工作代码:

...
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 之间的随机整数。

要将一系列随机数作为一个单元生成,您需要使用单个 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 回答