实现的原理:
1.初始化你要随机出的不重复的数字的范围 这里我用一个数组 比如{0,1,2,3,4,5,6,7}
2.然后打乱数组中数字的位置
具体步骤:随机出来一个index,将这个index作为数组的下标的数字与数组中最后一个数字交换
比如:随机出2 那么 结果就是 {0,1,7,3,4,5,6,2}
这样重复操作 数组的长度的一半次也就是 lenght/2 次,因为假设每次交换的位置都是不同的,我们就可以完全把数字打乱。
当然重复次数 越多 就打的越乱
假设重复lenght/2 此以后 数组是{5,7,0,2,4,6,1,3} 最后一次是3和4换
3.从最后一次随机出来的index,顺序选出之前的n-1个数字和这个数字一共n个 作为结果 假设n是4
那就将{7,0,2,4} 作为结果
代码如下
//随机出randomCount个不重复的数字,数字所在的范围是 start 到 end 包括start 和end
public static int[] randomInts(int start,int end,int randomCount){
//计算出要初始化的,用于打乱的数字数组的长度
int count=end-start+1;
// 从start 到 end 初始化这个数组
int[] ints=new int[count];
for(int i=0;i<count;i++){
ints[i]=i+start;
}
Random r=new Random();
int index=0,temp=0;
//做数组长度一半的 交换
for(int i=0;i<count/2;i++){
//随机出一个数组的下标
index=r.nextInt(count);
//将数组最后一个数字保存在temp中
temp=ints[count-1];
//将数组的第index+1个数放到最后一个位置上
ints[count-1]=ints[index];
//将刚才保存的数,放到数组中第index+1的位置上
ints[index]=temp;
//完成交换
}
//找出最后一次交换的index,也就是数组第index+1个数的位置
//从这个位置往前数randomCount,便找到,结果数组在被打乱的数组中的起始位置
index=index-randomCount;
//如果index越界了,就从第一个开始
if(index<0){
index=0;
}
//初始一个结果数组长度为randomCount
int[] rs=new int[randomCount];
//从被打乱的数字的第index+1个数开始 ,依次将数字放到结果数组中
for(int i=0;i<randomCount;i++){
rs[i]=ints[index+i];
}
return rs;
}
使用 假设我要从0到29这30个数字随机出15个不重复的数字,调用如下
int[] rs=randomInts(0,29,15);