Fisher-Yates 算法-数组元素随机交换

洗牌算法在日常项目中非常实用,特别是在需要随机打乱数组元素或者集合顺序的情况下。在 JavaScript 中,一个常见的洗牌算法是 Fisher-Yates 算法,也称为 Knuth 洗牌算法。这个算法的基本思路是从数组末尾开始,依次将当前元素与之前随机位置的元素交换,直到整个数组被遍历过一遍。

这段代码实现了一个经典的数组洗牌算法,称为Fisher-Yates算法,也称为Knuth洗牌算法。

  1. 函数定义
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 循环从最后一个元素开始向前遍历数组,直到第一个元素。
  1. 随机交换过程
    • 在每次迭代中,生成一个随机索引 j,其范围是从 0 到当前迭代的索引 i
    • 使用解构赋值 [arr[i], arr[j]] = [arr[j], arr[i]],交换数组中索引为 ij 的元素的值。
  2. 洗牌结果
    • 循环结束后,数组 arr 中的元素将被随机重新排列。
  3. 返回值
    • 返回洗牌后的数组 arr,同时也可以在函数外部捕获该返回值并使用。
  4. 示例用法
javascript 复制代码
let arr = [4, 5, 6, 7];
arr = shuffleArray(arr);
console.log(arr); // 可能输出类似 [5, 7, 4, 6] 的随机顺序
  • 在示例中,将数组 [4, 5, 6, 7] 传递给 shuffleArray 函数,然后打印洗牌后的结果。这里输出的顺序每次运行可能不同,因为数组的元素位置是随机的。

通过Fisher-Yates算法实现了一种有效的数组洗牌方法,用来随机交换数组元素的位置,确保每个元素有相等的概率出现在每个可能的位置上。

相关推荐
Mr_Xuhhh4 分钟前
C语言深度剖析--不定期更新的第二弹
android·java·c语言·开发语言·数据结构·算法·排序算法
2401_844139034 分钟前
Java健康养老智慧相伴养老护理小程序系统源码代办陪诊陪护更安心
微信·微信小程序·小程序·微信公众平台·微信开放平台
努力学习的小趴菜。13 分钟前
数组的学习
数据结构·学习·算法
caperxi18 分钟前
vue 踩坑记录
前端·javascript·vue.js
2301_7969821424 分钟前
location.protocol+‘//‘+location.hostname实现什么功能?
java·前端·javascript·python
Bro_cat25 分钟前
如何衡量一个算法的好坏
数据结构·算法
皆过客,揽星河38 分钟前
数学建模统计题中常用的聚类分类
python·算法·数学建模·numpy·数据处理·k-means
数模加油站41 分钟前
【2024数模国赛赛题思路公开】国赛C题思路丨附可运行代码丨无偿自提
算法·数学建模·数学建模国赛·高教社杯·2024国赛
嵌入式冰箱1 小时前
2024 年高教社杯全国大学生数学建模竞赛题目【A/B/C/D/E题】完整思路
java·人工智能·算法
程序员大金1 小时前
基于SSM+Vue+MySQL的出租车管理系统
java·前端·数据库·vue.js·mysql·oracle·tomcat