比較常見的方法是:每次在獲取隨機數後都與之前獲取的數進行比較,如果重複就重新獲取。個人比較杞人憂天,擔心每次重新獲取的隨機數還是重複的,所以就不太敢用這種方法。
個人的方法是根據需要先定義一個有序數組,然後進行無序排列,最後進行順序或者倒序截取。
直接上代碼:
//1.從0-9中獲取任意個不重複的整數(0<len<11)
static int[] getRandom10(int len){
//根據需要自定義有序數組
int[] ra=new int[10];
for(int i=0;i<10;i++){
ra[i]=i;
}
//無序排列實際上i最大到8即可,因爲當i=9時,10-i=1,rd.nextInt(10-i)=0,ra[0]與ra[0]無所謂交換
for(int i=0;i<10;i++){
Random rd=new Random();
int temp1=rd.nextInt(10-i);
int temp2=ra[9-i];//保存相對末尾的數據
ra[9-i]=ra[temp1];//交換
ra[temp1]=temp2;
}
//上面的i實際上<9即可,因爲當i=9時,temp1=rd.nextInt(10-9)=0,ra[temp1]與ra[9-i]均指代ra[0],無所謂交換
//順序截取
int[] returnInt=new int[len];
for(int i=0;i<len;i++){
returnInt[i]=ra[i];
}
//返回
return returnInt;
}
//2.從0-99中獲取任意個不重複的整數(0<len<101)
static int[] getRandom100(int len){
//根據需要自定義有序數組
int[] ra=new int[100];
for(int i=0;i<100;i++){
ra[i]=i;
}
//無序排列,只重複len次
for(int i=0;i<len;i++){
Random rd=new Random();
int temp1=rd.nextInt(100-i);
int temp2=ra[99-i];//保存相對末尾的數據
ra[99-i]=ra[temp1];//交換
ra[temp1]=temp2;
}
//倒序截取
int[] returnInt=new int[len];
for(int i=0;i<len;i++){
returnInt[i]=ra[99-i];
}
//返回
return returnInt;
}
//3.隨機獲取一個6位數的整數,要求數字不重複,不含0
static int getRandom6(){
int returnNum=0;
//自定義有序數
int[] ra=new int[9];
for(int i=0;i<9;i++){
ra[i]=i+1;
}
//無序排列並取值
for(int i=0;i<6;i++){
returnNum*=10;
Random rd=new Random();
int temp1=rd.nextInt(9-i);
int temp2=ra[8-i];//保存相對末尾的數據
ra[8-i]=ra[temp1];//交換
ra[temp1]=temp2;
returnNum+=ra[8-i];//取值
}
return returnNum;
}
//4.該方法可以類推到字母等,自己寫O(∩_∩)O~