您的位置:首页 > 其它

随机产生不同的数

2014-07-13 23:09 176 查看
开始以为产生一个不同的数组,这个程序还是非常简单的。但是之后经过自己仔细的揣摩,其实发现这里面还是有着许多门道的。多的不说,程序代码目录结构如下所示:



首先看下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;
}
}


主要就是取出一个数后,将这个数和已得到的数组进行判断。如果之前已经得到了这个数,再重复得到一个随机数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: