Fisher-Yates 洗牌算法(也称为 Knuth 洗牌算法),是一种在编程中用来随机排列一个有限序列(比如数组)的有效算法。其核心思想是遍历数组,对于每个位置,随机选取一个包括当前位置在内的、尚未处理的位置,然后与当前位置交换元素。这个过程一直进行到遍历完所有元素。
Fisher-Yates 洗牌算法的一个关键点是确保每个元素都能等概率地出现在数组的任何位置上。
以下是使用 Java 实现 Fisher-Yates 洗牌算法的一个例子:
import java.util.Random;
public class FisherYatesShuffle {
public static void shuffle(int[] array) {
//正着写
Random random = new Random();
for (int i = 0; i < nums.length; ++i) {
int j = i + random.nextInt(nums.length - i);
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
//倒着写
Random rand = new Random();
for (int i = array.length - 1; i > 0; i--) {
// 随机选择一个[0, i]之间的索引
int j = rand.nextInt(i + 1);
// 交换array[i]和array[j]
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
public static void main(String[] args) {
int[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
shuffle(numbers);
// 打印洗牌后的数组
for (int number : numbers) {
System.out.print(number + " ");
}
}
}