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