随机产生不同的数
2014-07-13 23:09
176 查看
开始以为产生一个不同的数组,这个程序还是非常简单的。但是之后经过自己仔细的揣摩,其实发现这里面还是有着许多门道的。多的不说,程序代码目录结构如下所示:
首先看下Test.java测试文件
代码相对来说比较简单,其实就是参照了工厂模式方法,具体说明可以参照之前写的一篇博客文章.
第一种方法,用ArrayList实现
这个程序主要逻辑就是,用ArrayList装载所有的球,随机取出一个ArrayList的下标后,将值付给红球数组中,然后在ArrayList将此球移除出去。这样就可以避免产生相同的红球
第二种方法,用Array数组实现
这个程序的主要逻辑就是,用一个boolean数组来进行判断是否会产生相同的红球。
从balls数组取出一个红球后,再把相对应boolean数组下标改成true。没得到一个球,判断相对应的boolean数组是否已经有相同的球产生。这里需要注意的一点就是boolean默认值为false。
第三种方法,利用TreeSet实现
这个程序的主要逻辑是:Set接口中是不能加入重复元素的。而对于TreeSet而言,它本身是排序的,且对于int数据类型,它自己就实现了Compareable排序。这样对于是否得到重复的数直接交给TreeSet来判断即可
第四种方法,利用常规方法
主要就是取出一个数后,将这个数和已得到的数组进行判断。如果之前已经得到了这个数,再重复得到一个随机数。
首先看下Test.java测试文件
/* * 主方法通过类的多态性,实现类的向下转型。接口的一个标准进行控制多种不同方法输出的实现 */ public class Test { public static void main(String args[]) { /* * 这里可以换成多种方法,同样也可以利用反射机制来处理Class.ForName("com.lenovo.test.ArrayListMethod") * 也可以利用工厂设计模式中的抽象工厂方法,对每一种方法都建一个工厂类型的接口进行操作 */ RandomAllMethodFactory factory = new ArrayListMethodFactory(); RandomAllMethod TwoColorBalls = factory.createRandomAllMethod(); int[] twoColorBalls = TwoColorBalls.getArrays(); for (int i : twoColorBalls) { System.out.print(i + " "); } } }
代码相对来说比较简单,其实就是参照了工厂模式方法,具体说明可以参照之前写的一篇博客文章.
第一种方法,用ArrayList实现
public class ArrayListMethod implements RandomAllMethod { public int[] getArrays() { List<Integer> array = new ArrayList<Integer>(); for (int i = 1; i <= 33; i++) { array.add(i); } int random[] = new int[6]; Random r = new Random(); for (int i = 0; i < random.length; i++) { int temp = r.nextInt(array.size()); // 其实是取出对应的下标号 random[i] = array.get(temp); // 通过下标号取出对应的数字 array.remove(temp); } Arrays.sort(random); return random; } }
这个程序主要逻辑就是,用ArrayList装载所有的球,随机取出一个ArrayList的下标后,将值付给红球数组中,然后在ArrayList将此球移除出去。这样就可以避免产生相同的红球
第二种方法,用Array数组实现
public class ArrayMethod implements RandomAllMethod { public int[] getArrays() { int[] balls = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33 }; boolean[] used = new boolean[balls.length]; // 注意boolean默认是false Random r = new Random(); int random[] = new int[6]; int count = 0; while (true) { if (count == random.length) { break; } int index = r.nextInt(33); if (!used[index]) { used[index] = true; random[count++] = balls[index]; } } Arrays.sort(random); return random; } }
这个程序的主要逻辑就是,用一个boolean数组来进行判断是否会产生相同的红球。
从balls数组取出一个红球后,再把相对应boolean数组下标改成true。没得到一个球,判断相对应的boolean数组是否已经有相同的球产生。这里需要注意的一点就是boolean默认值为false。
第三种方法,利用TreeSet实现
public class TreeSetMethod implements RandomAllMethod { public int[] getArrays() { Set<Integer> setRandom = new TreeSet<Integer>(); while (true) { if (setRandom.size() > 6) { break; } setRandom.add(new Random().nextInt(33) + 1); } Object[] temps = setRandom.toArray(); // 转换成Object数组 int random[] = new int[6]; for (int i = 0; i < random.length; i++) { random[i] = Integer.parseInt(temps[i].toString()); } return random; } }
这个程序的主要逻辑是:Set接口中是不能加入重复元素的。而对于TreeSet而言,它本身是排序的,且对于int数据类型,它自己就实现了Compareable排序。这样对于是否得到重复的数直接交给TreeSet来判断即可
第四种方法,利用常规方法
public class NormalMethod implements RandomAllMethod { public int[] getArrays() { int index = 0; Random r = new Random(); int[] random = new int[6]; while (true) { int temp = r.nextInt(33) + 1; if (!findKey(random, temp)) { random[index++] = temp; } if (index == random.length) { break; } } Arrays.sort(random); return random; } public boolean findKey(int array[], int temp) { for (int i = 0; i < array.length; i++) { if (array[i] == temp) { return true; } } return false; } }
主要就是取出一个数后,将这个数和已得到的数组进行判断。如果之前已经得到了这个数,再重复得到一个随机数。
相关文章推荐
- 随机产生不同数
- 跟着音乐节奏随机的产生不同颜色形状的图形
- 随机产生不同的数
- iOS 中根据线条的角度不同随机产生颜色
- 从表中随机返回n条记录。可以修改下面的语句,要求下次执行时产生不同的结果集?
- 随机产生13个0~51不同的随机数 -思想(定义参考系)
- 【嵌入式系统学习记录】练习题:设计一个洗牌发牌的程序;(随机产生52个不同的数)
- flash中随机产生20-100之间10个不同的数字,然后不能重复地随机取出这十个数字
- 产生不同的随机整数(线性时间)
- 从表中随机返回n条记录,要求下次执行时产生不同结果集
- java随机产生几个不同的字符
- java练习1--随机产生13个0~51不同的随机数
- Linux_C练习:设计一个洗牌发牌的程序;(随机产生52个不同的数)
- log4j的日志配置,按照不同包产生不同的日志文件
- 使用Django从数据库中随机取N条记录的不同方法及其性能实测
- 产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复
- 随机产生30组四则运算
- java随机生成6/8/12位数,要求每次产生的随机数与已生成的随机数不重复
- sqlserver 自定义函数随机产生指定范围的随机数
- 从大到小产生随机10个1000以内随机整数