/** * 利用set的无序性产生不重复的随机整数数组 * @param min 整数数组的最小值 * @param max 整数数组的最大值 * @return */ public static int[] randSort(int min,int max) { int[] arr = new int[max-min+1]; //给arr依次赋值 for (int i = 0; i < arr.length; i++) { arr[i]=min+i; } Random random = new Random(); Set<Float> set = new HashSet<Float>(); for (int i : arr) { set.add(i+random.nextFloat()); } int j=0; for (Float float1 : set) { arr[j] = (int)float1.floatValue(); j++; } return arr; }
本方法利用了set的无序性将输入的整数值进行排序,因为对于同一整数数组,set遍历出的结果是一样的,如[3,4,5]不管遍历多少次可能都是[5,4,3],但是[3.1,4.1,5.1]和[3.2,4.2,5.2]返回的整数部分的顺序是不相同的,根据这个原理,每次遍历时随机生成一个小数加到整数的后面,存到set里,取出时再将小数部分去掉,就得到了一个无重复的随机整数数组了(注:1.8jdk中set数组近乎有序,整数以大小排序,小数以小数点后面第一位的大小排序,以此类推,由于本函数每个整数都加了一个随机小数,所以不受版本影响)
测试结果:
int [] arr = MathTools.randSort(100, 110); for (int i : arr) { System.out.print(i+" ");//107 103 108 104 100 109 105 101 110 106 102 } System.out.println(); int [] arr2 = MathTools.randSort(100, 110); for (int i : arr2) { System.out.print(i+" ");//108 104 102 109 105 101 110 106 100 107 103 } System.out.println(); int [] arr3 = MathTools.randSort(100, 110); for (int i : arr3) { System.out.print(i+" ");//100 108 104 103 107 102 110 106 105 101 109 } System.out.println(); int [] arr4 = MathTools.randSort(100, 110); for (int i : arr4) { System.out.print(i+" ");//110 108 104 100 105 101 106 102 109 103 107 }