洗牌算法在日常项目中非常实用,特别是在需要随机打乱数组元素或者集合顺序的情况下。在 JavaScript
中,一个常见的洗牌算法是 Fisher-Yates
算法,也称为 Knuth
洗牌算法。这个算法的基本思路是从数组末尾开始,依次将当前元素与之前随机位置的元素交换,直到整个数组被遍历过一遍。
这段代码实现了一个经典的数组洗牌算法,称为Fisher-Yates
算法,也称为Knuth
洗牌算法。
- 函数定义:
javascript
function shuffleArray(arr) {
// 递减生成,确保数组的每个值都被照顾到
// 循环遍历数组,从最后一个元素开始向前
for (let i = arr.length - 1; i > 0; i--) {
// 生成一个随机索引 j,范围是从 0 到 i
// 生成的最大值就是arr数组的最大索引
const j = Math.floor(Math.random() * (i + 1));
// 交换 arr[i] 和 arr[j] 的值 (当前遍历的值和新生成的索引值)
[arr[i], arr[j]] = [arr[j], arr[i]];
// 其它代码
// 你可以在这里修改 arr[i]的值...
}
return arr;
}
这段代码会将传入的数组 array
随机打乱顺序,并返回打乱后的数组。在实际项目中,洗牌算法常用于实现随机展示列表、随机选取数据等场景,是一个非常实用的算法。
shuffleArray
函数接受一个数组arr
作为参数,该数组的元素将被随机重排。- 使用
for
循环从最后一个元素开始向前遍历数组,直到第一个元素。
- 随机交换过程 :
- 在每次迭代中,生成一个随机索引
j
,其范围是从0
到当前迭代的索引i
。 - 使用解构赋值
[arr[i], arr[j]] = [arr[j], arr[i]]
,交换数组中索引为i
和j
的元素的值。
- 在每次迭代中,生成一个随机索引
- 洗牌结果 :
- 循环结束后,数组
arr
中的元素将被随机重新排列。
- 循环结束后,数组
- 返回值 :
- 返回洗牌后的数组
arr
,同时也可以在函数外部捕获该返回值并使用。
- 返回洗牌后的数组
- 示例用法:
javascript
let arr = [4, 5, 6, 7];
arr = shuffleArray(arr);
console.log(arr); // 可能输出类似 [5, 7, 4, 6] 的随机顺序
- 在示例中,将数组
[4, 5, 6, 7]
传递给shuffleArray
函数,然后打印洗牌后的结果。这里输出的顺序每次运行可能不同,因为数组的元素位置是随机的。
通过Fisher-Yates
算法实现了一种有效的数组洗牌方法,用来随机交换数组元素的位置,确保每个元素有相等的概率出现在每个可能的位置上。