在 JavaScript 中随机打乱数组的顺序 Fisher-Yate洗牌算法

Fisher-Yate洗牌算法

1
2
3
4
5
6
7
function shuffleArray(array) {
for (let i = array.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[array[i], array[j]] = [array[j], array[i]];
}
return array;
}

这个 shuffleArray 函数接受一个数组作为参数,并返回打乱顺序后的新数组。它使用了 Fisher-Yates 洗牌算法的思想:

  1. 从最后一个元素开始,向前遍历数组。
  2. 对于每个元素,生成一个随机索引 j,范围是从 0 到当前元素的索引 i。
  3. 将当前元素与随机索引 j 处的元素交换位置,通过解构赋值实现。
  4. 继续向前遍历数组,直到遍历完所有元素。
  5. 返回打乱顺序后的数组。

使用示例:

1
2
3
4
const array = [1, 2, 3, 4, 5];
const shuffledArray = shuffleArray(array);
console.log(shuffledArray);

这将输出一个随机打乱顺序的数组,例如 [3, 1, 5, 2, 4]。每次运行结果都可能不同,因为数组的顺序是随机的。

分开打乱(前面的多少个在里面打乱和后面部分里面打乱)

示例:前面6个在这6个里面打乱,后面的在后面里面打乱

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function shuffleArray(array) {
const firstFive = array.slice(0, 6);
const remaining = array.slice(6);

for (let i = firstFive.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[firstFive[i], firstFive[j]] = [firstFive[j], firstFive[i]];
}

for (let i = remaining.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[remaining[i], remaining[j]] = [remaining[j], remaining[i]];
}

return firstFive.concat(remaining);
}