数组洗牌是指将一个数组的元素顺序打乱,随机重新排列。算法的实现思路如下:从还没处理的数组(假设还剩下(n-i)个元素),随机产生一个[0,n-i)之间的数p,从剩下的k个数中把第p个数取出。直到把数字全部取完。
public int[] shuffle() {
int[] ans = nums.clone();
for (int i = 0; i < n; i++) {
swap(ans, i, i + random.nextInt(n - i));
}
return ans;
}
void swap(int[] arr, int i, int j) {
int c = arr[i];
arr[i] = arr[j];
arr[j] = c;
}
上边的代码表示先将nums数组克隆到ans中,从下标0开始,将数组下标为i和数组下标为i + random.nextInt(n - i)的数进行交换。这样最后得到的数组就是随机排列的数组。