您的位置:首页 > 其它

RandomList 的一个bug

2015-10-30 16:02 309 查看
 在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() + "  ");
}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: