java在给定范围内生成给定数量的随机数

最近写程序要用到这个方法,比如说我要生成50个在1000-2000范围内的随机数,而且不能重复,于是自己写了一个小算法,主体思想是这样的:

  比如1000-2000的随机数,先生成一个1000-2000的数组,数组大小当然是1001,然后产生0-1000的随机数去取数组的值,取到之后将这个值和数组的最后一个值进行调换,再产生0-999的随机数去取数组中的值,直到取出我们想要的数量为止。(至于为什么不直接删除,是因为数组的删除比较消耗时间 )

  具体代码如下:

/**
  * 在一定范围内生成给定数量的不重复随机数, 如果开始到结束的数量少于num的数量会抛出数组越界的错误,
  * 如果相等则会返回一个排好序的数组,即从begin到end 否则返回随机数组(list),不重复,不排序
  *
  * @author Cesar
  * @param begin
  *            开始值
  * @param end
  *            结束值
  * @param num
  *            要求数量
  * @return
  */
public List<Integer> getRandomNum(int begin, int end, int num) {
  int size = end-begin+1;
  int[] all = new int[size];
  Random random = new Random();
  List<Integer> result = new ArrayList<Integer>();
  int x;
  if (size < num) {
   throw new ArrayIndexOutOfBoundsException("数组越界");
  } else if (size == num ) {
   for (int i = 0; i < num; i++) {
    result.add(begin++);
   }
  } else {
   for(int i=0;i<size;i++){
    all[i] = begin++;
   }
   for(int i = 0;i<num;i++){
    x = random.nextInt(size);//获得坐标
    result.add(all[x]);
    all[x] = all[size-1];
    size--;
   }
  }
  return result;
}

猜你喜欢

转载自cesar28.iteye.com/blog/2238797