UYOU
一个笨办法就是直接初始化数组,每个数字对号入座,然后随机挑选,第一次的结果与倒数第一位交换,第二次的结果与倒数第二位交换,当然交换后,下次挑随机数的范围也会相应减一。
至于效率如何,楼主可以执行下。
public static void main(String[] args) {
// 初始化数组
int[] arr = new int[1000000];
for (int i = 0; i < arr.length; i++) {
arr[i] = i;
}
int randomCount = 1000; // 要生成多少个随机数
Random random = new Random(); // 随机数生成器
long startTime = System.currentTimeMillis(); // 计时
for (int i = 0; i < randomCount; i++) {
// 随机挑选
int pickIndex = random.nextInt(arr.length - i);
// 交换
int t = arr[pickIndex];
arr[pickIndex] = arr[arr.length - 1 - i];
arr[arr.length - 1 - i] = t;
}
System.out.println("take time: " + (System.currentTimeMillis() - startTime) + " ms");
// 输出结果(超过一万就不输出了,直接看耗时)
if (randomCount < 10000) {
for (int i = 0; i < randomCount; i++) {
System.out.printf("%06d ", arr[arr.length - i - 1]);
if (i % 40 == 39) {
System.out.println();
}
}
}
}