java利用复循环洗牌算法_实现不重复取数两种算法(洗牌算法)
时间: 2024-02-01 10:04:53 浏览: 88
好的,下面是我给您的答案。
Java利用Fisher-Yates算法(又称Knuth shuffle算法)实现不重复取数洗牌算法:
```java
public static int[] shuffle(int[] arr) {
Random rand = new Random();
for (int i = arr.length - 1; i > 0; i--) {
// 随机生成一个 [0, i] 之间的索引
int j = rand.nextInt(i + 1);
// 交换 arr[i] 和 arr[j]
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
return arr;
}
```
Java实现另一种不重复取数算法:
```java
public static int[] randomSelect(int[] arr, int n) {
Random rand = new Random();
int[] result = new int[n];
for (int i = 0; i < n; i++) {
// 随机生成一个 [i, arr.length - 1] 之间的索引
int j = i + rand.nextInt(arr.length - i);
// 交换 arr[i] 和 arr[j]
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
result[i] = arr[i];
}
return result;
}
```
这两种算法都可以实现不重复取数洗牌,第一种算法是经典的Fisher-Yates算法,效率较高,但需要修改原数组;第二种算法则是每次从剩余的数中随机选择一个,效率略低,但不会修改原数组。
阅读全文