RandomList 的一个bug

来源:互联网 发布:淘宝一分钱试用在哪里 编辑:程序博客网 时间:2024/05/29 14:45
 在java 编程思想 第四版 15章第2 节 中有一个是让写一个 随机集合 ,就是 每次调用select方法,都会得到随机的选取一个元素, 里面代码很简单,就是每次调用select的时候,根据集合的大小,随机的选取一个数字,取出来,思路很简答,但是有个地方 作者用错了,

private Random random = new Random(47); 

尽管作者很喜欢47 但是这里也不能填上47 因为如果填写47的话,就不是随机数了,尽管看起来是随机的,可是当你再次运行的时候,发现还是这一列数字, 我的每次运行都是 

lazy  quick  brown  dog  this  this  quick  jumped  over  brown  brown    这几个数字 ,原因是 创建随机数的构造方法有无参和带有参数的,带有参数的例如47 是随机种子,详情可以参考 http://www.cnblogs.com/ningvsban/p/3590722.html  这篇blog   不带参数 以当前时间作为种子 每次运行当前时间肯定是不相同的 

大概内容就是 种子相同,结果也就相同,种子不同,得出的结果也就不同


所以应该改成这样

public class RandomList<T> {

private ArrayList<T> storage = new ArrayList<T>();

// 47 是一个种子 对于种子相同的Random对象,生成的随机数序列是一样的

// private Random random = new Random(47); 尽管作者很喜欢47 但是这里也不能填上47 因为如果填写47的话,就不是随机数了

private Random random = new Random();


public void add(T item) {

storage.add(item);

}


public T select() {

return storage.get(random.nextInt(storage.size()));

}


public static void main(String[] args) {

RandomList<String> rs = new RandomList<String>();

for (String s : "this quick brown fox jumped over  this lazy brown dog".split(" ")) {

rs.add(s);

}


for (int i = 0; i < 11; i++) {

System.out.print(rs.select() + "  ");

}


}


}



0 0