java隨機抽取指定規模內不反復的n個數。本站提示廣大學習愛好者:(java隨機抽取指定規模內不反復的n個數)文章只能為提供參考,不一定能成為您想要的結果。以下是java隨機抽取指定規模內不反復的n個數正文
1、JAVA中生成隨機數的方法
1、在j2se中應用Math.random()令體系隨機拔取一個0~1之間的double類型小數,將其乘以一個數,好比25,就可以獲得一個0~25規模內的隨機數,這個在j2me中沒有;
int randomNumber = (int) Math.round(Math.random()*(max-min)+min);
2、在System類中有一個currentTimeMillis()辦法,這個辦法前往從1970年1月1號0點0分0秒到今朝的一個long型的毫秒數,可作為一個隨機數,還可以將其對某些數取模,就可以限制隨機數的規模;此方法在輪回中同時發生多個隨機數時,會是雷同的值,有必定的局限性!
long randomNum = System.currentTimeMillis(); int randomNumber = (int) randomNum%(max-min)+min;
3、應用java.util.Random類來發生一個隨機數產生器,這個也是我們在j2me的法式裡常常用的一個取隨機數的辦法。它有兩種情勢的結構函數,分離是Random()和Random(long seed)。Random()應用以後時光即System.currentTimeMillis()作為產生器的種子,Random(long seed)應用指定的seed作為產生器的種子。隨機數產生器(Random)對象發生今後,經由過程挪用分歧的method:nextInt()、nextLong()、nextFloat()、nextDouble()等取得分歧類型隨機數。 假如兩個Random對象應用雷同的種子(好比都是25),而且以雷同的次序挪用雷同的函數,那它們前往值完整雷同。
Random random = new Random(); int randomNumber = random.nextInt(max)%(max-min+1) + min;
2、隨機給定規模內N個不反復的數
1、辦法一:最簡略最易懂得的兩重輪回去重
/** * 隨機指定規模內N個不反復的數 * 最簡略最根本的辦法 * @param min 指定規模最小值 * @param max 指定規模最年夜值 * @param n 隨機數個數 */ public static int[] randomCommon(int min, int max, int n){ if (n > (max - min + 1) || max < min) { return null; } int[] result = new int[n]; int count = 0; while(count < n) { int num = (int) (Math.random() * (max - min)) + min; boolean flag = true; for (int j = 0; j < n; j++) { if(num == result[j]){ flag = false; break; } } if(flag){ result[count] = num; count++; } } return result; }
2、辦法二:應用HashSet的特點,只能寄存分歧的值
/** * 隨機指定規模內N個不反復的數 * 應用HashSet的特點,只能寄存分歧的值 * @param min 指定規模最小值 * @param max 指定規模最年夜值 * @param n 隨機數個數 * @param HashSet<Integer> set 隨機數成果集 */ public static void randomSet(int min, int max, int n, HashSet<Integer> set) { if (n > (max - min + 1) || max < min) { return; } for (int i = 0; i < n; i++) { // 挪用Math.random()辦法 int num = (int) (Math.random() * (max - min)) + min; set.add(num);// 將分歧的數存入HashSet中 } int setSize = set.size(); // 假如存入的數小於指定生成的個數,則挪用遞歸再生成殘剩個數的隨機數,如斯輪回,直達到到指定年夜小 if (setSize < n) { randomSet(min, max, n - setSize, set);// 遞歸 } }
3、辦法三:消除已隨機到的數
/** * 隨機指定規模內N個不反復的數 * 在初始化的無反復待選數組中隨機發生一個數放入成果中, * 將待選數組被隨機到的數,用待選數組(len-1)下標對應的數調換 * 然後從len-2裡隨機發生下一個隨機數,如斯類推 * @param max 指定規模最年夜值 * @param min 指定規模最小值 * @param n 隨機數個數 * @return int[] 隨機數成果集 */ public static int[] randomArray(int min,int max,int n){ int len = max-min+1; if(max < min || n > len){ return null; } //初始化給定規模的待選數組 int[] source = new int[len]; for (int i = min; i < min+len; i++){ source[i-min] = i; } int[] result = new int[n]; Random rd = new Random(); int index = 0; for (int i = 0; i < result.length; i++) { //待選數組0到(len-2)隨機一個下標 index = Math.abs(rd.nextInt() % len--); //將隨機到的數放入成果集 result[i] = source[index]; //將待選數組中被隨機到的數,用待選數組(len-1)下標對應的數調換 source[index] = source[len]; } return result; }
挪用實例:
public static void main(String[] args) { int[] reult1 = randomCommon(20,50,10); for (int i : reult1) { System.out.println(i); } int[] reult2 = randomArray(20,50,10); for (int i : reult2) { System.out.println(i); } HashSet<Integer> set = new HashSet<Integer>(); randomSet(20,50,10,set); for (int j : set) { System.out.println(j); } }
3、示例代碼
package test; import java.util.HashSet; import java.util.Random; public class Snippet { /** * 隨機指定規模內N個不反復的數 * 在初始化的無反復待選數組中隨機發生一個數放入成果中, * 將待選數組被隨機到的數,用待選數組(len-1)下標對應的數調換 * 然後從len-2裡隨機發生下一個隨機數,如斯類推 * @param max 指定規模最年夜值 * @param min 指定規模最小值 * @param n 隨機數個數 * @return int[] 隨機數成果集 */ public static int[] randomArray(int min,int max,int n){ int len = max-min+1; if(max < min || n > len){ return null; } //初始化給定規模的待選數組 int[] source = new int[len]; for (int i = min; i < min+len; i++){ source[i-min] = i; } int[] result = new int[n]; Random rd = new Random(); int index = 0; for (int i = 0; i < result.length; i++) { //待選數組0到(len-2)隨機一個下標 int s=rd.nextInt()%len; // System.out.print(s-- +","); index = Math.abs(rd.nextInt()%len--); // System.out.println(index); //將隨機到的數放入成果集 result[i] = source[index]; //將待選數組中被隨機到的數,用待選數組(len-1)下標對應的數調換 source[index] = source[len]; } return result; } public static void main(String[] args) { // int[] reult1 = randomCommon(20,50,10); // for (int i : reult1) { // System.out.println(i); // } int[] reult2 = randomArray(0,4,5); for (int i : reult2) { System.out.print(i); } // HashSet<Integer> set = new HashSet<Integer>(); // randomSet(20,50,10,set); // for (int j : set) { // System.out.println(j); // } } }
以上就是本文的全體內容,願望對年夜家進修java法式設計有所贊助。