1 package com.jdk7.chapter4;
2
3 import java.util.ArrayList;
4 import java.util.List;
5 import java.util.Random;
6
7 /**
8 * 指定范围类生成一组指定个数的随机数
9 *
10 * @author Administrator
11 *
12 */
13 public class UnRepeatRandomNumber {
14 private int min;
15 private int max;
16
17 public UnRepeatRandomNumber(){
18 this.min = 0;
19 this.max = 10;
20 }
21
22 public UnRepeatRandomNumber(int min, int max){
23 if(max>=min){
24 this.min = min;
25 this.max = max;
26 }
27 }
28
29 /**
30 * 返回一组随机数,以Integer[]类型返回,如果数组中已存在生成的随机数,则丢弃,重新生成随机数
31 * @param length
32 * @return
33 */
34 public Integer[] getMethodA(int length){
35 if(length<=0){
36 System.out.println("生成随机数的个数不能小于1");
37 return new Integer[0];
38 }else if(length>(max-min+1)){
39 System.out.println("生成随机数的个数不能超出取值范围总个数!");
40 length = (max-min+1);
41 }
42 Random random = new Random();
43 List list = new ArrayList();
44 //因为不知道具体要循环多少次,所以只能用while的判断条件来进行循环
45 while((list.size())<length){
46 int number = min+random.nextInt(max-min+1);
47 if(!list.contains(number)){
48 list.add(number);
49 }
50 }
51 return (Integer[])list.toArray(new Integer[2]);
52 }
53
54 /**
55 * 按照生成随机数的范围,将所有可能生成的随机数存放在源数组
56 * 循环体中进行如下操作:
57 * 随机生成源数组的下标number
58 * 获取源数组下标number对应的值依次存放入目标数组中
59 * 源数组中移除存入目标数组的随机数
60 * 直到目标数组长度达到预期值
61 * @param length
62 * @return
63 */
64 public Integer[] getMethodB(int length){
65 if(length<=0){
66 System.out.println("随机数数组长度不能小于零!");
67 return new Integer[0];
68 }else if(length>(this.max-this.min+1)){
69 System.out.println("生成随机数的个数不能超出取值范围总个数!");
70 length = this.max-this.min+1;
71 }
72 //将所有可能生成的随机数存放在src中
73 List src = new ArrayList();
74 for(int i=min;i<(max+1);i++){
75 src.add(i);
76 }
77 Random random = new Random();
78 //存放需要的目标随机数组
79 List result = new ArrayList();
80 //因为这里是先比较大小,再进行添加,循环次数是从0到length-1,达到了数组要求的长度
81 //如果是先添加数组元素再比较,那么如果希望循环length次的话,判断条件需改为(result.size())<=length
82 while((result.size())<length){
83 int number = random.nextInt(src.size());
84 //从待生成数组中获取对应下标的元素,依次存入目标数组中
85 result.add(src.get(number));
86 src.remove(number);
87 }
88 return (Integer[])result.toArray(new Integer[0]);
89 }
90
91 public void printInteger(Integer[] integer){
92 if(integer==null){
93 System.out.println("数组为空!");
94 }else if(integer.length<=0){
95 System.out.println("数组长度小于零!");
96 }
97 for(int i=0;i<integer.length;i++){
98 System.out.print(integer[i]+" ");
99 }
100 System.out.println();
101 }
102
103 }
1 package com.jdk7.chapter4;
2
3 public class UnRepeatRandomNumberTest {
4 public static void main(String[] args) {
5 // UnRepeatRandomNumber ranumber = new UnRepeatRandomNumber();
6 UnRepeatRandomNumber ranumber = new UnRepeatRandomNumber(2,12);
7
8 ranumber.printInteger(ranumber.getMethodA(12));
9 ranumber.printInteger(ranumber.getMethodA(0));
10 ranumber.printInteger(ranumber.getMethodA(11));
11
12 ranumber.printInteger(ranumber.getMethodB(12));
13 ranumber.printInteger(ranumber.getMethodB(-1));
14 ranumber.printInteger(ranumber.getMethodB(11));
15 }
16 }
17
18 执行结果:
19 生成随机数的个数不能超出取值范围总个数!
20 8 12 10 3 5 4 11 6 9 2 7
21 生成随机数的个数不能小于1
22 数组长度小于零!
23
24 10 12 7 3 6 4 5 11 2 8 9
25 生成随机数的个数不能超出取值范围总个数!
26 5 3 12 10 6 8 7 9 2 4 11
27 随机数数组长度不能小于零!
28 数组长度小于零!
29
30 11 2 9 7 3 8 12 10 6 4 5