(1) 把N个数放入Hashtable 或者arrayList 中. (2) 从上面的集合中随机抽取一个数放入int数组中. (3) 把取出的这个数从上面的集合中删除. (4) 循环 (2),(3) 步骤,直到int数组取满为止.
import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;
public class Main {
private static int range = 100;
private static ArrayList<Integer> originalList = new ArrayList<Integer>();
private static ArrayList<Integer> result = new ArrayList<Integer>();
static {
for (int i = 1; i <= range; i++) {
originalList.add(i);
}
}
public static void main(String args[]) {
for (int i = 0; i < range; i++) {
int j = range - i;
int r = (int) (new Random().nextInt(j));
result.add(originalList.get(r));
System.out.print(originalList.get(r) + ', ');
originalList.remove(r);
}
Collections.sort(result);
System.out.println('\n\n生成的数组大小是:' + result.size() + '------以下是排序结果,看是否有重复的随机数');
for (Integer i : result) {
System.out.print(i + ', ');
}
}
}
执行结果如下:
我们一般都会想到这种做法,但是当Hashtable或者ArrayList中放几千万,几亿数据时,这时从集合中删除元素将严重影响性能,如果突破此瓶颈? 网上找到一种更好的方法. (1) 把N个数放到容器A(int数组)中. 说明:也就是第二次是从容器A中 第一个元素到倒数第二个元素 中随机取一个数. 所以,向下面这样实现会更好: public class Main {
private static int range = 100;
private static int[] result;
public static void main(String args[]) {
result = getNumber(range);
for (int i = 0; i < range; i++) {
System.out.print(result[i] + ', ');
}
}
public static int[] getNumber(int total){
int[] NumberBox = new int[total]; //容器A
int[] rtnNumber = new int[total]; //容器B
for (int i = 0; i < total; i++){
NumberBox[i] = i; //先把N个数放入容器A中
}
int end = total - 1;
for (int j = 0; j < total; j++){
int num = new Random().nextInt(end + 1); //取随机数
rtnNumber[j] = NumberBox[num]; //把随机数放入容器B
NumberBox[num] = NumberBox[end]; //把容器A中最后一个数覆盖所取的随机数
end--; //缩小随机数所取范围
}
return rtnNumber; //返回int型数组
}
}
执行结果如下:
|
|