Java獲取不重複的隨機整數(非輪詢比較循環排除法)

  這裏只討論隨機整數,一般用於生成不重複的隨機密碼。
  比較常見的方法是:每次在獲取隨機數後都與之前獲取的數進行比較,如果重複就重新獲取。個人比較杞人憂天,擔心每次重新獲取的隨機數還是重複的,所以就不太敢用這種方法。
  個人的方法是根據需要先定義一個有序數組,然後進行無序排列,最後進行順序或者倒序截取。

直接上代碼:


	//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~


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章