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法式設計有所贊助。