您的位置:首页 > 编程语言 > Java开发

Java获取不重复的随机整数(非轮询比较循环排除法)

2014-05-03 13:06 381 查看
  这里只讨论随机整数,一般用于生成不重复的随机密码。

  比较常见的方法是:每次在获取随机数后都与之前获取的数进行比较,如果重复就重新获取。个人比较杞人忧天,担心每次重新获取的随机数还是重复的,所以就不太敢用这种方法。

  个人的方法是根据需要先定义一个有序数组,然后进行无序排列,最后进行顺序或者倒序截取。

直接上代码:

//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~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: