Random类的一个使用误区

昨天和一个朋友聊天谈到他的面试经历,其中提到一个题目是用最熟悉的语言写一个程序产生15个10到100的整数,他特别提到他用Java写了一些循环并每次重新用
当前时间的long值做种子,当时我就很奇怪,但是他说Random有问题,每次产生的随机数都是一样的。回想了一下,他可能是遇到了我曾经遇到的那个问
题,在使用Random的时候要把产生的Ramdom实例保存起来,不能每次用的时候都重新new一个。具体代码如下:
范例代码如下:
public class RandomTest {
  private static Random random = new Random();

  public static void main(String[] args) {
    for (int i = 0; i < 15; i++) {
      System.out.println((random.nextInt(90) + 10));
    }
  }

}

典型的误用代码如下:
public class RandomTest {
  public static void main(String[] args) {
    for (int i = 0; i < 15; i++) {
      Random random = new Random();
      System.out.println((random.nextInt(90) + 10));
    }
  }

}

2005.11.18更新:
对于这个里面的误用代码JDK1.5确实修正了,但是修正的方法是修改了new Random(),1.5以前实际上是

public Random()
Creates a new random number generator. Its seed is initialized to a value
based on the current time:

 public Random() { this(System.currentTimeMillis()); }

Two
Random objects created within the same millisecond will have the same sequence
of random numbers.

而在1.5中是:

public Random()
Creates a new random number generator. This constructor sets the seed
of the random number generator to a value very likely to be distinct
from any other invocation of this constructor.

所以实际上1.5中并没有彻底解决这个问题,根据同样是他的文档:
If two
instances of Random are created with the same seed, and the same
sequence of method calls is made for each, they will generate and
return identical sequences of numbers.
那么典型的误用代码就变成了:
public class RandomTest {
  public static void main(String[] args) {
    for (int i = 0; i < 15; i++) {
      Random random = new Random(100000);
      System.out.println((random.nextInt(90) + 10));
    }
  }

}


作者: Cherami
原载: Random类的一个使用误区
版权所有。转载时必须以链接形式注明作者和原始出处及本声明。

日志评价

 Votes | Average: 0 out of 5 Votes | Average: 0 out of 5 Votes | Average: 0 out of 5 Votes | Average: 0 out of 5 Votes | Average: 0 out of 5 (暂无评价) --点击星星直接投票
Loading ... Loading ...


相关日志



随机日志



添加到网摘

[del.icio.us]  [新浪 VIVI]  [365key]  [YouNote]  [博采中心]  [Poco]  [SOHU狐摘]  [天极网摘]  [和讯网摘]
喜欢这个插件?

当前日志信息