0

我最近读到您不想在不必要时创建新实例。我不确定我是否明白它在说什么。问题是 LogCat 中的重复:

08-09 17:12:11.300: D/dalvikvm(19620): GC_FOR_ALLOC freed 2281K, 23% free 9365K/12048K, paused 12ms, total 12ms

那么有这个方法更好吗:

public int rand(int i) {
    int rand = new Random().nextInt(i);
    return rand;
}

而不是有这个方法:

public int rand(int i) {
    return new Random().nextInt(i);
}

如果你经常打电话给 rand() ?为什么或者为什么不?感谢帮助新手!

4

4 回答 4

4

我敢打赌这两种方法会生成相同的字节码。您真正想要实现的是拥有一个实例Random,并nextInts从该实例调用,以免一直重置种子。

于 2013-08-09T21:27:02.740 回答
4

做这个:

class ... {

  private final Random dice = new Random();

  public int rand(int i) {
    return dice.nextInt(i);
  }

}

这样,您new Random()只需调用一次,而不是每次生成一个号码。

于 2013-08-09T21:41:02.707 回答
1

性能在这里只是偶然的。如果您Random在每次调用时都创建一个新对象,那么您不仅会浪费时间,而且根本不会得到随机数。您必须Random只创建一次对象以创建生成器,之后调用next...它的各种函数将从该生成器生成随机数。这就是随机数生成器的工作原理。

于 2013-08-10T02:08:55.867 回答
-2

在我看来,你让事情变得比他们需要的更复杂。无需调用创建 Random 对象并返回新随机数的方法,只需在调用 rand(int i) 方法的方法中创建 Random 对象。例如,不要这样做:

public void someMethod()
{
    int randomInt = rand(5);
}

做这个:

public void someMethodImproved()
{
    Random randObject = new Random();
    int randInt = randObject.nextInt(5);
}

然后,您可以根据需要继续调用 randObject.nextInt(5),它会继续为您提供 0(包括)和 5(不包括)之间的伪随机整数。

于 2013-08-09T21:41:16.400 回答