随机出不重复的数字(不用随机出然后进行比较 JAVA实现)

实现的原理:

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);

 

 

点赞