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() + " ");
}
}
}
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() + " ");
}
}
}
相关文章推荐
- Unix高级环境编程学习之-----线程pthread_create
- Ubuntu中安装TurnServer服务器
- noip2013 花匠 (动态规划求最长抖动序列)
- [置顶] 【android】音乐播放器之设计思路
- SQL中GETDATE()一些操作
- xlsx批量转为utf8的csv
- xlsx批量转为utf8的csv
- 第十课 选择结构
- 阿里“三活”数据中心实践经验:没人能做,我们就自己做
- java中的合并流SequenceInputStreamDemo
- Tomcat源码分析(二)------ 一次完整请求的里里外外
- Tomcat源码分析(一)------ 架构
- 《数学之美》--读书笔记
- 《数据结构(严蔚敏版)》学习笔记(四)——Hanoi塔问题
- ionic android下双击返回退出应用
- JBoss-7.1.1 http访问端口修改
- 最短路
- php三种实现多线程类似的方法
- Echarts通过svg画扇形例子,含矩形、三角形等
- SQL Server 2008 数据库编程摘要四 :游标篇