我怎样才能洗牌?

在前端开发中,经常需要对数组或列表进行洗牌操作。本文将介绍几种实现洗牌的方法,并为读者提供深入解析和指导意义。

洗牌方法

1. Fisher–Yates shuffle(Knuth Shuffle)

Fisher–Yates shuffle 是一种传统的洗牌算法,它有时也被称为 Knuth Shuffle,因为其由 Donald E. Knuth 在《计算机程序设计艺术》中描述。该算法的基本思路是在每个位置上随机选择一个元素来交换。

-------- ----------------------- -
  --- ---- - - ---------- - -- - -- -- ---- -
    ----- - - ------------------------ - -- - ----
    -------- ------- - -------- --------
  -
  ------ ----
-

2. Durstenfeld shuffle

Durstenfeld shuffle 是对 Fisher–Yates shuffle 的一种改进版本,它使用了现代的 for 循环语法,以及随机数生成器 Math.random()。与 Fisher–Yates shuffle 不同,Durstenfeld shuffle 是从数组的开始位置向后遍历,并在每个位置上随机选择一个元素来交换。

-------- ----------------------- -
  --- ---- - - -- - - ---------- - -- ---- -
    ----- - - ------------------------ - ----------- - --- - --
    -------- ------- - -------- --------
  -
  ------ ----
-

3. Lodash shuffle

Lodash 是一个流行的 JavaScript 工具库,它包含了许多常用的函数和工具。其中一个函数是 shuffle,它使用了 Fisher–Yates shuffle 算法,并添加了一些额外的保护性代码,以确保它能够正确地处理各种情况。

----- - - ------------------
----- -------- - ---------------

指导意义

在实现洗牌算法时,我们需要考虑以下几个方面:

  1. 随机数生成器:为了获得真正的随机结果,我们需要使用一个好的随机数生成器。在 JavaScript 中,我们可以使用 Math.random(),但该函数并不是真正的随机数生成器,因为它仅基于当前时间戳生成伪随机数。如果需要更高质量的随机数,可以使用 crypto.getRandomValues(),这是一个由浏览器提供的真正的随机数生成器。

  2. 性能:对于大型数组,洗牌算法可能会造成性能问题。Fisher–Yates shuffle 和 Durstenfeld shuffle 都需要 O(n) 的时间复杂度,而 Lodash shuffle 则具有更快的平均性能。

  3. 稳定性:洗牌算法应该是可重复的,并且对于相同的输入,应该始终生成相同的输出。如果需要生成不同的结果,请使用不同的随机数种子或添加其他额外的标志。

示例代码

以下是一个示例数组:

----- --- - ----- ---- ---- ---- ---- -----

我们可以使用上述算法之一来对其进行洗牌:

------------------------
------------------------
---------------

以上代码将返回一个随机重新排序的数组。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/8513


猜你喜欢

  • 用jQuery获取元素的类列表

    在前端开发中,我们经常需要获取HTML元素的类列表来执行一些操作。通过jQuery库,可以轻松地获取元素的类列表,方便我们进行DOM操作。 获取元素类列表的方法 方法一:使用 .attr() 方法 使...

    7 年前
  • 如何使用JavaScript获得文本输入字段的值?

    在前端开发中,获得表单中用户输入的数据是非常常见的需求。在HTML中,我们可以使用文本输入字段(text input)来实现这个功能。本文将介绍如何使用JavaScript获取文本输入字段的值。

    7 年前
  • 如何按值从数组中移除项?

    在前端开发中,经常需要从数组中移除某些特定的项。本文将介绍如何按值从数组中移除项,包括常见的方法和注意事项。 方法一:使用 filter Array.prototype.filter() 方法可以过滤...

    7 年前
  • VanillaJS是什么?

    VanillaJS是指纯JavaScript编写的代码,不依赖于任何外部库或框架。与其他流行的前端框架如React、Angular和Vue相比,VanillaJS更加轻量级,易于学习和使用。

    7 年前
  • JavaScript中的GET请求?

    在 Web 开发中,GET 和 POST 是两种最常用的 HTTP 请求方法。本文将重点介绍 JavaScript 中的 GET 请求。 GET 请求的定义 GET 是一种 HTTP 请求方法,用于从...

    7 年前
  • 如何枚举JavaScript对象的属性

    在JavaScript中,对象是一种非常重要的数据类型。为了更好地操作和使用对象,我们需要枚举对象的属性。接下来,本文将详细介绍如何枚举JavaScript对象的属性。

    7 年前
  • 谷歌地图 JS V3 简单的多重标记示例

    谷歌地图是一款广泛使用的网页地图服务,为前端开发者提供了丰富的 API 接口。其中,通过 JavaScript API V3 可以轻松地在网页中嵌入 Google 地图,并实现各种功能。

    7 年前
  • 在代码中设置一个JavaScript断点——在Chrome中?

    调试是前端开发中最重要的技能之一。当我们的应用程序在浏览器中出现错误时,我们需要知道它们在何处发生,并找到解决问题的方法。设置 JavaScript 断点是一个非常有用的工具,可以帮助我们实现这一目标...

    7 年前
  • 区别咕噜,NPM和Bower:package.json VS bower.json

    前端开发中,当我们需要引入第三方库或插件时,常常会使用到包管理工具。其中比较常见的有咕噜(Yarn)、NPM和Bower。本文将详细介绍它们之间的区别以及在使用时应该注意的问题。

    7 年前
  • JavaScript 中的 call() 和 apply() VS ()?

    JavaScript 是一门功能强大的编程语言,它提供了很多方便的函数调用方式。其中两种函数调用方法就是 call() 和 apply()。它们能够改变函数中的上下文(context),也就是函数内的...

    7 年前
  • 一个控制器能呼叫另一个吗?

    在前端开发中,控制器(Controller)是一种常见的设计模式,用于管理应用程序中的业务逻辑。但是,在某些情况下,一个控制器可能需要调用另一个控制器来执行任务。那么,一个控制器能呼叫另一个吗?本文将...

    7 年前
  • 从JavaScript数组中获取随机项

    在前端开发中,我们经常需要使用数组来存储和操作一系列相关的数据。有时候,我们需要从数组中随机地获取一项数据,这在实现一些随机功能或展示随机内容时非常有用。本文将介绍如何使用JavaScript从数组中...

    7 年前
  • 检测移动浏览器

    随着移动设备的普及,越来越多的用户使用移动浏览器浏览网页。在前端开发中,我们需要对移动浏览器进行检测,以便做出相应的适配和优化。 检测方法 1. User-Agent 字符串 移动浏览器通常在 Use...

    7 年前
  • JavaScript中的静态变量

    在JavaScript中,静态变量是指在类定义中声明的变量,它们与实例无关,并且在所有实例之间共享。这使得静态变量成为一种有用的方式来存储和访问与类相关的数据。 声明静态变量 在JavaScript中...

    7 年前
  • module.exports VS Node.js出口

    在Node.js中,有两种方式可以导出模块:使用module.exports和使用exports。它们基本上是等效的,但是它们之间有一些微小的差异,这篇文章将探讨这些差异并提供指导。

    7 年前
  • 访问/进程(嵌套)对象、数组或JSON

    在前端开发中,我们常常需要访问和处理复杂的数据结构,例如对象、数组和 JSON。而这些数据结构往往会被嵌套,也就是说它们的属性值可能是另一个对象、数组或 JSON。

    7 年前
  • gcoord:地理坐标处理库,实现百度高德谷歌坐标互转

    gcoord: 地理坐标处理库 在前端开发中,我们经常需要处理地理位置相关的信息。例如,我们可能需要将用户输入的地址转换成经纬度坐标,在地图上显示一个标记,或者计算两个地点之间的距离等。

    7 年前
  • 在前端中如何在内存中创建供用户下载的文件

    如果你需要在前端页面中动态地生成一个文件并提供给用户下载,通常情况下你可能会使用服务器上的文件来实现这一目的。但是,如果你想优化应用程序的性能并减少对后端的依赖,那么在内存中创建一个文件并提供给用户下...

    7 年前
  • 我如何检查一个对象在JavaScript中是否有一个键?

    在 JavaScript 中,我们可以使用以下几种方法来检查对象是否具有某个键: 方法一:in 运算符 in 运算符用于检查对象是否具有指定的属性。它返回一个布尔值,如果对象具有该属性,则返回 tru...

    7 年前
  • 在JavaScript控制台中包含jQuery

    JavaScript控制台是前端开发者在开发过程中使用最频繁的工具之一。它提供了一个交互式环境,允许我们测试和调试JavaScript代码。但是,有时候我们需要在控制台中使用jQuery来帮助我们完成...

    7 年前

相关推荐

    暂无文章