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~


发布了99 篇原创文章 · 获赞 54 · 访问量 55万+

猜你喜欢

转载自blog.csdn.net/mrlixirong/article/details/24913771