Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
JS数组如何随机排序_JavaScript数组随机打乱顺序方法与洗牌算法教程_创想鸟

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

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

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

JavaScript中实现数组随机排序,也就是常说的“洗牌”,最常用的方法是使用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. 返回新数组的洗牌方法

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

立即学习“Java免费学习笔记(深入)”;

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() 实现随机排序:

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数组如何随机排序_JavaScript数组随机打乱顺序方法与洗牌算法教程的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1534925.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
使用 JavaScript 动态创建正方形网格
上一篇 2025年12月21日 02:00:24
JavaScript如何使用正则表达式_JavaScript正则表达式创建与匹配方法教程
下一篇 2025年12月21日 02:00:32

相关推荐

  • Chrome浏览器怎么设置最小字体大小_网页最小显示字体设置教程

    Chrome浏览器怎么设置最小字体大小_网页最小显示字体设置教程Chrome浏览器怎么设置最小字体大小_网页最小显示字体设置教程Chrome浏览器怎么设置最小字体大小_网页最小显示字体设置教程Chrome浏览器怎么设置最小字体大小_网页最小显示字体设置教程

    首先调整Chrome最小字体设置至12像素以上,其次可通过页面缩放或开发者工具临时修改字体大小以提升可读性。 如果您发现Chrome浏览器中某些网页的字体过小导致阅读困难,这可能是因为浏览器或网页本身设置了较小的最小字体限制。以下是解决此问题的步骤: 本文运行环境:Dell XPS 13,Windo…

    2026年9月25日 • 用户投稿
    100
  • Java多态中成员变量是否具有动态绑定特性

    成员变量不具有动态绑定特性,其访问基于引用变量的声明类型而非实际对象类型。例如,当父类和子类存在同名成员变量时,通过父类引用访问该变量将获取父类中的值,即使实际对象是子类实例。这体现了静态绑定,即在编译期确定访问的变量。相比之下,实例方法支持动态绑定(后期绑定),在运行时根据对象的实际类型决定调用哪…

    2026年9月25日
    100
  • Java 中处理货币数据的正确方式

    Java 中处理货币数据的正确方式Java 中处理货币数据的正确方式Java 中处理货币数据的正确方式Java 中处理货币数据的正确方式

    在 Java 应用程序中,尤其是在处理财务数据时,选择正确的数据类型至关重要。货币数据通常以特定的格式呈现,例如包含货币符号(如美元符号 $)和千位分隔符(如逗号 ,)。直接将这些数据映射到 DTO 类时,我们需要仔细考虑数据类型的选择,以避免潜在的精度损失和计算错误。 货币数据类型选择考量 常见的…

    2026年9月25日 • 用户投稿
    000
  • 夸克怎么关闭自动打开淘宝_夸克禁止跳转第三方App设置

    夸克怎么关闭自动打开淘宝_夸克禁止跳转第三方App设置夸克怎么关闭自动打开淘宝_夸克禁止跳转第三方App设置夸克怎么关闭自动打开淘宝_夸克禁止跳转第三方App设置夸克怎么关闭自动打开淘宝_夸克禁止跳转第三方App设置

    关闭夸克浏览器“允许打开第三方应用”权限可解决跳转问题。依次进入设置→浏览器偏好→关闭该选项;同时在系统设置中将淘宝等App的链接打开方式设为“不打开”或“询问”;搜索时长按结果选择“在浏览器中打开”;使用无痕浏览模式避免唤端行为。 如果您在使用夸克浏览器时,点击链接后自动跳转到淘宝等第三方App,…

    2026年9月25日 • 用户投稿
    100
  • 如何在Debian上检测Nginx SSL状态

    在debian系统上检测nginx的ssl状态,可以通过以下几种方法进行: 使用Nginx命令行工具:打开终端,输入以下命令来检查Nginx的SSL配置是否正确: sudo nginx -t -c /etc/nginx/nginx.conf 这个命令会测试Nginx配置文件的语法是否正确,并且会显示…

    2026年9月25日
    000
  • Java 中处理货币数据的最佳实践

    Java 中处理货币数据的最佳实践Java 中处理货币数据的最佳实践Java 中处理货币数据的最佳实践Java 中处理货币数据的最佳实践

    本文旨在探讨在 Java 中处理货币数据的最佳实践。面对 JSON 数据中包含的货币值(例如 “$234,205,860″),直接使用 String 存储是一种选择,但可能并非最优。本文将深入分析各种数据类型在处理货币时的优劣,并推荐使用 BigDecimal 进行精确计算,…

    2026年9月25日 • 用户投稿
    000
  • Java向上转型中可变参数方法调用的行为解析:重载与编译时绑定的深层机制

    Java向上转型中可变参数方法调用的行为解析:重载与编译时绑定的深层机制Java向上转型中可变参数方法调用的行为解析:重载与编译时绑定的深层机制Java向上转型中可变参数方法调用的行为解析:重载与编译时绑定的深层机制Java向上转型中可变参数方法调用的行为解析:重载与编译时绑定的深层机制

    本文深入探讨Java中向上转型、方法重载与可变参数(varargs)的交互机制。通过具体代码示例,详细解释了在向上转型场景下,为何编译器会基于引用变量的编译时类型来解析方法调用,即使子类存在看似更匹配的重载方法。核心在于方法重载是编译时决策,而可变参数在重载解析中具有较低的优先级。理解这些机制对于编…

    2026年9月25日 • 用户投稿
    000
  • VSCode如何通过SSH连接远程开发 VSCode远程SSH开发的配置与调试技巧

    安装“remote – ssh”扩展是实现vscode远程开发的基础;2. 配置ssh连接需在~/.ssh/config中设置host、hostname、user、port和identityfile等参数以实现快速连接;3. 连接成功后vscode会自动在远程安装vs code serv…

    2026年9月25日
    500
  • sublime怎么实时预览markdown文件 _sublime Markdown实时预览方法

    sublime怎么实时预览markdown文件 _sublime Markdown实时预览方法sublime怎么实时预览markdown文件 _sublime Markdown实时预览方法sublime怎么实时预览markdown文件 _sublime Markdown实时预览方法sublime怎么实时预览markdown文件 _sublime Markdown实时预览方法

    通过安装MarkdownPreview和LiveReload插件,可在Sublime Text中实现Markdown文件的准实时预览:先用Package Control安装插件,配置导出HTML到浏览器,再结合LiveReload实现保存即刷新,最后可设置Ctrl+Alt+M为快捷键,完成高效写作体…

    2026年9月25日 • 用户投稿
    400
  • Groovy编程:在HTTP请求头中传递授权令牌的实践指南

    Groovy编程:在HTTP请求头中传递授权令牌的实践指南Groovy编程:在HTTP请求头中传递授权令牌的实践指南Groovy编程:在HTTP请求头中传递授权令牌的实践指南Groovy编程:在HTTP请求头中传递授权令牌的实践指南

    本教程详细介绍了如何在Groovy中通过HTTP请求头发送授权令牌,以实现对RESTful API的安全访问。针对用户在Groovy中模拟curl -H ‘Authorization: token …’命令时遇到的常见问题,本文提供了基于java.net.URL和…

    2026年9月25日 • 用户投稿
    900
  • 如何确保 Debian Node.js 日志的完整性

    如何确保 Debian Node.js 日志的完整性如何确保 Debian Node.js 日志的完整性如何确保 Debian Node.js 日志的完整性如何确保 Debian Node.js 日志的完整性

    维护 Debian Node.js 应用的日志完整性至关重要,这有助于监控服务器状态、排查问题和优化性能。以下步骤和建议能有效保障日志完整性: 日志库的选择 选择合适的日志库是第一步。以下列举了一些常用的选项,各有优劣: Winston: 广受欢迎,支持多种输出方式,配置灵活,易于设定日志存储位置。…

    2026年9月25日 • 用户投稿
    000
  • Spring Boot 应用:分离 REST API 和 Web 应用的最佳实践

    Spring Boot 应用:分离 REST API 和 Web 应用的最佳实践Spring Boot 应用:分离 REST API 和 Web 应用的最佳实践Spring Boot 应用:分离 REST API 和 Web 应用的最佳实践Spring Boot 应用:分离 REST API 和 Web 应用的最佳实践

    本文旨在探讨在 Spring Boot 项目中,如何有效地分离 REST API 和 Web 应用程序。针对小型项目,建议保持简单,将代码放在同一模块的不同包中。对于大型项目,则需要考虑可伸缩性、团队协作和性能需求,将前后端分离成两个独立的 Spring Boot 应用。文章将深入分析不同场景下的架…

    2026年9月25日 • 用户投稿
    300
  • uc浏览器如何阻止网页自动播放视频_UC浏览器禁止视频自动播放设置

    uc浏览器如何阻止网页自动播放视频_UC浏览器禁止视频自动播放设置uc浏览器如何阻止网页自动播放视频_UC浏览器禁止视频自动播放设置uc浏览器如何阻止网页自动播放视频_UC浏览器禁止视频自动播放设置uc浏览器如何阻止网页自动播放视频_UC浏览器禁止视频自动播放设置

    1、可通过UC浏览器设置关闭自动播放:进入设置→网站管理→媒体自动播放,选择关闭;2、启用省流加速模式减少视频自动加载;3、使用隐私模式浏览限制脚本执行,阻止视频自动播放。 如果您在使用UC浏览器浏览网页时,遇到视频自动播放影响阅读体验的情况,可以通过调整浏览器设置来禁止此行为。自动播放功能通常由浏…

    2026年9月25日 • 用户投稿
    600
  • 如何备份Claude聊天记录 Claude数据备份与恢复教程

    如何备份Claude聊天记录 Claude数据备份与恢复教程如何备份Claude聊天记录 Claude数据备份与恢复教程如何备份Claude聊天记录 Claude数据备份与恢复教程如何备份Claude聊天记录 Claude数据备份与恢复教程

    要备份claude聊天记录,可采取以下四种方法:一、打开对话点击菜单选择“导出对话”保存为文本文件;二、截图后用ocr工具提取文字并保存为文档;三、高级用户可用自动化工具或脚本自动抓取保存对话内容;四、误删后优先查看本地或云端备份,必要时联系客服。建议以预防为主定期备份确保数据安全。 ☞☞☞AI 智…

    2026年9月25日 • 用户投稿
    700
  • 通过索引访问 LinkedHashMap 的值

    通过索引访问 LinkedHashMap 的值通过索引访问 LinkedHashMap 的值通过索引访问 LinkedHashMap 的值通过索引访问 LinkedHashMap 的值

    通过索引访问 LinkedHashMap 的值 本文将探讨如何比较两个 LinkedHashMap 中具有相同键的值,并提供一种有效的解决方案。LinkedHashMap 是一种可以保持插入顺序的 Map 实现,但它并不支持像 List 那样通过索引直接访问元素。因此,当我们需要比较两个 Linke…

    2026年9月25日 • 用户投稿
    1200
  • UC浏览器怎么录制网页视频_UC浏览器网页视频录制功能使用教程

    UC浏览器怎么录制网页视频_UC浏览器网页视频录制功能使用教程UC浏览器怎么录制网页视频_UC浏览器网页视频录制功能使用教程UC浏览器怎么录制网页视频_UC浏览器网页视频录制功能使用教程UC浏览器怎么录制网页视频_UC浏览器网页视频录制功能使用教程

    1、可通过UC浏览器录制功能保存网页视频:打开视频后使用系统录屏,选择媒体声音并开始录制,完成后自动保存至相册;2、部分视频支持嗅探下载:开启UC浏览器视频嗅探功能,识别视频资源后选择画质下载至Download目录;3、对于加密视频可启用开发者模式,通过检查元素捕获媒体请求链接,复制URL用第三方工…

    2026年9月25日 • 用户投稿
    100
  • 通过索引获取 LinkedHashMap 的值?解决方案与最佳实践

    通过索引获取 LinkedHashMap 的值?解决方案与最佳实践通过索引获取 LinkedHashMap 的值?解决方案与最佳实践通过索引获取 LinkedHashMap 的值?解决方案与最佳实践通过索引获取 LinkedHashMap 的值?解决方案与最佳实践

    本文旨在解决如何比较两个 LinkedHashMap 中具有相同键(chargeTypeName)的值的问题。由于 LinkedHashMap 本身不支持通过索引直接访问,文章将探讨如何利用流(Stream)和分组(Grouping)等技术,有效地找出两个 LinkedHashMap 中键相同的值对…

    2026年9月25日 • 用户投稿
    100
  • win7系统使用默认浏览器的设置方法

    win7系统使用默认浏览器的设置方法win7系统使用默认浏览器的设置方法win7系统使用默认浏览器的设置方法win7系统使用默认浏览器的设置方法

    我们都知道,系统默认启动的应用程序是预先设定好的,比如浏览器,默认情况下可能是某个特定的浏览器(如ie)。如果用户希望更换成其他浏览器,可以按照以下步骤进行设置。接下来,让我们一起看看具体的操作流程。 首先,点击屏幕左下角的“Windows”图标,然后从开始菜单中选择“控制面板”,如下图所示: 其次…

    2026年9月25日 • 用户投稿
    100
  • qq浏览器怎么用微信登录 QQ浏览器微信扫码快速登录指南

    qq浏览器怎么用微信登录 QQ浏览器微信扫码快速登录指南qq浏览器怎么用微信登录 QQ浏览器微信扫码快速登录指南qq浏览器怎么用微信登录 QQ浏览器微信扫码快速登录指南qq浏览器怎么用微信登录 QQ浏览器微信扫码快速登录指南

    首先通过电脑QQ浏览器点击微信图标获取二维码,用手机微信扫描并确认登录;或使用手机QQ浏览器扫描电脑端二维码,跳转微信验证后完成授权登录。 如果您在使用QQ浏览器时需要通过微信进行快捷登录,通常会通过扫描二维码的方式实现。以下是完成此操作的具体步骤: 本文运行环境:联想ThinkPad X1 Car…

    2026年9月25日 • 用户投稿
    200
  • 使用 Jackson 进行复杂类的自定义反序列化

    使用 Jackson 进行复杂类的自定义反序列化使用 Jackson 进行复杂类的自定义反序列化使用 Jackson 进行复杂类的自定义反序列化使用 Jackson 进行复杂类的自定义反序列化

    本文介绍了如何使用 Jackson 库对包含复杂嵌套类的 JSON 字符串进行自定义反序列化。通过 ObjectMapper 的 readValue 方法可以实现简单场景下的自动反序列化。针对需要定制化处理的场景,可以结合 ObjectMapper 和自定义反序列化器来实现更灵活的反序列化逻辑,并提…

    2026年9月25日 • 用户投稿
    1000

发表回复

登录后才能评论
关注微信