新闻中心

JS数组如何随机排序_J*aScript数组随机打乱顺序方法与洗牌算法教程

2025-11-02
浏览次数:
返回列表
Fisher-Yates洗牌算法是J*aScript中实现数组随机排序的推荐方法,通过从数组末尾开始与随机位置交换元素,确保每个元素等概率出现在任意位置。该算法可原地修改数组或返回新数组,避免使用sort() + Math.random()这种不公正的方法,还可封装为数组原型方法以方便调用,核心在于正确生成范围为[0, i]的随机索引,保证打乱结果的公平性与高效性。

js数组如何随机排序_javascript数组随机打乱顺序方法与洗牌算法教程

J*aScript中实现数组随机排序,也就是常说的“洗牌”,最常用的方法是使用Fisher-Yates 洗牌算法。这种方法高效、公平,能确保每个元素出现在任意位置的概率相等。下面介绍几种实用的实现方式。

1. Fisher-Yates 洗牌算法(推荐)

该算法从数组末尾开始,依次与前面的随机位置交换元素。每一步都减少待处理部分的长度,直到整个数组被打乱。

// 原地打乱数组(修改原数组)

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;
}

// 使用示例

const arr = [1, 2, 3, 4, 5];
shuffleArray(arr);
console.log(arr); // 输出类似 [3, 1, 5, 2, 4]

2. 返回新数组的洗牌方法

如果不想修改原数组,可以先复制一份再打乱。

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

// 示例:不改变原数组

const original = [1, 2, 3, 4, 5];
const shuffled = getShuffledArray(original);
console.log(original); // [1, 2, 3, 4, 5]
console.log(shuffled); // 随机顺序

3. 不推荐:使用 sort() + Math.random()

有些人会用 sort() 配合 Math.random() 实现随机排序:

OneStory OneStory

OneStory 是一款创新的AI故事生成助手,用AI快速生成连续性、一致性的角色和故事。

OneStory 319 查看详情 OneStory

arr.sort(() => Math.random() - 0.5);

这种方法看似简单,但结果并不真正随机,不同浏览器的排序算法可能导致偏差,某些排列出现概率更高。因此不建议在需要公平打乱的场景使用。

4. 扩展:封装成数组原型方法(可选)

如果你经常需要打乱数组,可以扩展 Array.prototype:

Array.prototype.shuffle = function() {
  for (let i = this.length - 1; i > 0; i--) {
    const j = Math.floor(Math.random() * (i + 1));
    [this[i], this[j]] = [this[j], this[i]];
  }
  return this;
};

// 使用

const list = [10, 20, 30, 40];
list.shuffle();
console.log(list); // 随机顺序

基本上就这些。Fisher-Yates 是最可靠的方式,理解原理后很容易写出稳定高效的随机排序代码。不复杂但容易忽略细节,比如随机索引范围必须包含当前项。掌握这个算法,数组打乱就没问题了。

以上就是JS数组如何随机排序_J*aScript数组随机打乱顺序方法与洗牌算法教程的详细内容,更多请关注其它相关文章!


# 拖拽  # 营销推广页面图片素材  # 深圳seo网站推广  # 淘宝网站优化策略有哪些  # seo计划执行  # 网站建设类直通车  # seo全部教程下载  # 永新网站关键词优化  # 物流网站建设网站  # 温州定制网站建设制作  # 陕西网站建设优化软件  # 有哪些  # 这种方法  # 如果你  # js如何使用教程  # 拖放  # 高阶  # 有什么区别  # 出现在  # 如何实现  # 如何使用  # 排列  # 排序算法  # 浏览器  # js  # java  # javascript 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: J*aScript Promise链中如何正确终止后续.then执行并处理错误  C++如何检测键盘输入_C++ _kbhit与_getch函数非阻塞输入  Golang如何使用bytes.Split分割字节切片_Golang bytes切片分割方法  J*aScript DOM操作:高效清空列表元素的策略与实践  Composer中的^和~符号代表什么_精通Composer版本号语义化约束  Excel函数批量查找替换超快方法_Excel用REPLACE和FIND函数秒级替换  PowerPoint如何制作滚动字幕结尾彩蛋_PowerPoint路径动画实现平滑滚动字幕效果  mcjs网页版流畅运行 mcjs低配电脑畅玩入口  Mac怎么查看崩溃日志_Mac控制台错误报告分析  汽水音乐车机版横屏版7.1 汽水音乐车机版横屏版下载入口  Safari怎么安装扩展程序 浏览器插件安装与管理方法【详解】  特斯拉自动驾驶房车计划曝光 原型车将于2027年亮相  Surface怎么安装系统 微软Surface Pro U盘重装win11教程  快手极速版在线观看 官方网页版登录地址  jQuery Mask 插件中实现电话号码固定前导零的教程  中兴Axon42Ultra怎样在文件App筛图_iPhone中兴Axon42Ultra文件App筛图【图片筛选】  J*aScript实现单选按钮与关联输入框的联动禁用教程  利用5118提升短视频内容效果_5118短视频关键词优化方法  快手官方唯一登录入口 谨防山寨钓鱼网站  Win10如何清理注册表垃圾 Win10手动清理无效注册表【技巧】  c++如何使用chrono库处理时间_c++标准库时间与日期操作  内存检查:在VS Code中调试C++时的内存视图  顺丰快件物流信息 官方网站查询入口  Bilibili动漫最新防封地址发布-Bilibili动漫2025年最稳正版入口推荐  邮政快递单号查询入口 邮政快递物流信息在线查询入口  抓大鹅解压小游戏 抓大鹅摸鱼解压入口  zookeeper 都有哪些功能?  Python类型检查:优化关联可选属性的Mypy推断策略  蛙漫官网漫画入口地址_蛙漫在线畅读无广告弹窗  晋江读书网页版在线登录 晋江读书电脑版官网  百度网盘网页版入口 百度网盘网页版官方登录网址  Typer应用中动态命令行参数的解析与处理  2026年发布! 美少女养成动作RPG《神剑少女战记》发布实机演示  AO3官方镜像站点汇总 AO3同人作品网页版直达链接  c++如何使用TBB库进行任务并行_c++ Intel线程构建模块  mysql通配符支持数字匹配吗_mysql通配符能否用于数字匹配的解析  2025-2030年全球乘用车销量预测:新能源成增长主力  Steam官网入口直达 Steam注册及登录步骤  百度浏览器字体显示异常偏小_百度浏览器字体渲染修复方案  邮政快递包裹最新位置 邮政快递实时追踪入口  Win11怎么修改默认浏览器_Windows 11设置Chrome为默认  冬*霸灯泡不亮怎么办_浴霸取暖灯一盏不亮的灯座清洁修复法  Yandex官方入口网址 Yandex俄罗斯搜索引擎最新在线地址  C++20的source_location是什么_C++在编译期获取源码位置信息用于日志和断言  c++如何实现一个简单的ECS框架_c++数据驱动设计与游戏开发  包子漫画官方网站在线链接-包子漫画在线阅读平台主页地址  126邮箱网页版官方入口 126邮箱账号在线登录平台  Python多版本共存与虚拟环境管理深度指南  C++的std::mdspan是什么_C++23中用于操作多维数组的非拥有视图  抖音网页版怎么|直播|_抖音网页版开播操作指南 

搜索