随机方法的效率

时间:2013-08-09 21:25:30

标签: java random instance performance

我最近读到你不想在不必要时创建新实例。我不确定我是否理解它的含义。问题是在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()?为什么或者为什么不?感谢您帮助newb!

4 个答案:

答案 0 :(得分:4)

我敢打赌这两种方法会产生相同的字节码。您实际想要实现的是拥有一个Random实例,只需从该实例调用nextInts,以便不会一直重置种子。

答案 1 :(得分:4)

这样做:

class ... {

  private final Random dice = new Random();

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

}

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

答案 2 :(得分:1)

表演仅仅是偶然的。如果您在每次通话时都创建一个新的Random对象,那么您不仅会浪费时间,而且根本不会获得随机数。您必须只创建一次Random对象来创建一个生成器,然后在其上调用各种next...函数将从该生成器生成随机数。这就是随机数生成器的工作方式。

答案 3 :(得分:-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(不包括)之间的伪随机整数。