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~


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值