注意:如何取一組不重復的隨機數,這種方法的前提是取數的這個數組沒有重復的數方可。
(1)換位排除法
1 /** 2 * @param arr 取數的數組 3 * @param noRepeatNumbers 要獲取不重復數的個數 4 */ 5 public static int[] getNoRepeatNumByChanget(int[] arr, int noRepeatNumbers) { 6 7 int[] newArr = new int[noRepeatNumbers]; 8 for (int i = 0; i < noRepeatNumbers; i++) { 9 Random random = new Random(); 10 //角標是從i-arr.length-1的隨機數 11 //這里0%5=0 1%5=1 2%5=2 .....5%5=0; 12 int s = random.nextInt(arr.length - 1) % (arr.length - 1 - i + 1) 13 + i; 14 int temp = arr[i]; 15 //將隨機取到的下標的值,與i交換,然后下一次取i++到length的一個隨機數 16 arr[i] = arr[s]; 17 arr[s] = temp; 18 newArr[i] = arr[i]; 19 } 20 return newArr; 21 }
(2)set排異法
1 /** 2 * 3 * @param arr 要遍歷的數組 4 * @param noRepeatNumbers 獲取不重復數的個數 5 * @return 6 */ 7 public static Set<Integer> getNoRepeatNumBySet(int[] arr, 8 int noRepeatNumbers) { 9 Random random = new Random(); 10 Set<Integer> set = new HashSet<Integer>(); 11 while (true) { 12 int s = random.nextInt(arr.length); 13 //將隨機的下標的數添加到set集合中 14 set.add(Integer.valueOf(arr[s])); 15 //如果set中的數長度等於要獲取不重復數的個數時,跳出循環 16 if (set.size() == noRepeatNumbers) { 17 break; 18 } 19 } 20 return set; 21 22 }