d3.shuffle、Fisher–Yates算法以及js 中的slice

这篇具有很好参考价值的文章主要介绍了d3.shuffle、Fisher–Yates算法以及js 中的slice。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.d3.shuffle

D3.shuffle() 方法用于将数组中的元素随机排序。它使用 Fisher–Yates 洗牌算法,该算法是无偏的,具有最佳的渐近性能(线性时间和常数内存)。

D3.shuffle() 方法的语法如下:

d3.shuffle(array, [start, end])

其中:

  • array 是原数组。
  • start 是开始索引,默认为 0。
  • end 是结束索引,默认为数组的长度。

如果 end 是负数,则它表示从数组末尾开始向前计算的索引。

D3.shuffle() 方法返回的数组是一个新数组,它包含原数组中元素的随机排列。

D3.shuffle() 方法的常见用法如下:

  • 将数组中的元素随机排序:
const arr = [1, 2, 3, 4, 5];
const shuffledArr = d3.shuffle(arr);
  • 将数组中的元素随机排序,并只返回指定范围内的元素:
const arr = [1, 2, 3, 4, 5];
const shuffledArr = d3.shuffle(arr, 1, 3);

D3.shuffle() 方法还可以与其他方法一起使用来实现更复杂的功能。例如,可以使用 D3.shuffle() 方法和 D3.map() 方法来随机选择数组中的元素。

const arr = [1, 2, 3, 4, 5];
const shuffledArr = arr.map(x => d3.shuffle(arr)[0]);

在上述示例中,D3.shuffle() 方法用于随机选择 arr 数组中的元素。D3.map() 方法用于将 shuffledArr 数组中的每个元素映射到一个新的数组中。

以下是 D3.shuffle() 方法的执行原理:

  1. D3.shuffle() 方法将原数组中的元素复制到一个新数组中。
  2. 使用 Fisher–Yates 洗牌算法对新数组中的元素进行随机排序。()
  3. 返回随机排序后的数组。

因此,D3.shuffle() 方法将返回一个包含原数组中元素的随机排列。

2.fisher-yate 洗牌算法

d3.shuffle、Fisher–Yates算法以及js 中的slice

Fisher–Yates 洗牌算法是一种随机排序算法,它使用以下步骤来将数组中的元素随机排序:

  1. 从数组中随机选择一个元素,并将其移到数组的末尾。(这里实际上是和末尾调换)
  2. 重复步骤 1,直到数组中的所有元素都被移到末尾。(第一部改变之后,最后一位不变)

Fisher–Yates 洗牌算法是无偏的,具有最佳的渐近性能(线性时间和常数内存)。

以下是 Fisher–Yates 洗牌算法的 JavaScript 实现:

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

该算法使用 Math.random() 方法来生成一个随机数,该数用于选择要移到末尾的元素。然后,算法将该元素与数组末尾的元素交换位置。

以下是 Fisher–Yates 洗牌算法的示例:

const arr = [1, 2, 3, 4, 5];
const shuffledArr = shuffle(arr);
console.log(shuffledArr); // [5, 4, 3, 2, 1]

在上述示例中,shuffledArr 数组将包含原数组中元素的随机排列。
来源:stackoverflow

3.示例

示例一:使用 d3.shuffle 来模拟一次扑克牌的洗牌过程。我们可以先创建一个包含52张扑克牌的数组,然后用 d3.shuffle 来打乱这个数组,最后用 d3.slice 来取出前几张牌作为发牌结果。例如:

// 导入 d3 库
import * as d3 from "d3";

// 创建一个扑克牌数组
let suits = ["♠", "♥", "♦", "♣"];
let ranks = ["A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"];
let cards = [];
for (let suit of suits) {
  for (let rank of ranks) {
    cards.push(suit + rank);
  }
}

// 打乱扑克牌数组
d3.shuffle(cards);

// 取出前五张牌作为发牌结果
let hand = d3.slice(cards, 0, 5);

// 打印出发牌结果
console.log(hand);

示例一:使用 d3.shuffle 来生成一个随机的颜色序列。我们可以先创建一个包含不同颜色名称和对应颜色代码的对象,然后用 d3.keys 和 d3.values 来提取出颜色名称和颜色代码的数组,再用 d3.shuffle 来打乱这两个数组,最后用 d3.permute 来根据打乱后的顺序重新组合成一个新的对象。例如:

// 导入 d3 库
import * as d3 from "d3";

// 创建一个颜色对象
let colors = {
  red: "#ff0000",
  orange: "#ffa500",
  yellow: "#ffff00",
  green: "#008000",
  blue: "#0000ff",
  violet: "#ee82ee"
};

// 提取出颜色名称和颜色代码的数组
let names = d3.keys(colors);
let codes = d3.values(colors);

// 打乱两个数组的顺序
d3.shuffle(names);
d3.shuffle(codes);

// 根据打乱后的顺序重新组合成一个新的对象
let shuffled = {};
for (let i = 0; i < names.length; i++) {
  shuffled[names[i]] = codes[i];
}

// 打印出新的对象
console.log(shuffled);

observablehq-d3-shuffle

4.js中slice的用法

JavaScript 的 slice() 方法用于从数组中返回一个新的数组,该数组包含原数组中指定范围内的元素。

slice() 方法的语法如下:

array.slice(start, end)

其中:

  • array 是原数组。
  • start 是开始索引,默认为 0。
  • end 是结束索引,不提取该元素,默认为数组的长度,也就是提取之后的所有元素。

如果 end 是负数,则它表示从数组末尾开始向前计算的索引。

slice() 方法返回的数组是一个浅拷贝,它不会影响原数组。

slice() 方法的常见用法如下:

  • 从数组中返回指定范围内的元素:
const arr = [1, 2, 3, 4, 5];
const newArr = arr.slice(1, 3); // [2, 3]
  • 从数组中返回所有元素:
const arr = [1, 2, 3, 4, 5];
const newArr = arr.slice(); // [1, 2, 3, 4, 5]

相当于slice(0,5)

  • 从数组中返回最后一个元素:
const arr = [1, 2, 3, 4, 5];
const newArr = arr.slice(-1); // [5]

这里相当于slice(-1,5),slice(4,5)

  • 从数组中返回第一个元素:
const arr = [1, 2, 3, 4, 5];
const newArr = arr.slice(0, 1); // [1]
  • 从数组中返回除最后一个元素之外的所有元素:
const arr = [1, 2, 3, 4, 5];
const newArr = arr.slice(0, -1); // [1, 2, 3, 4]
  • 从数组中返回除第一个元素之外的所有元素:
const arr = [1, 2, 3, 4, 5];
const newArr = arr.slice(1); // [2, 3, 4, 5]

这里面是默认end为4

slice() 方法还可以与其他方法一起使用来实现更复杂的功能。例如,可以使用 slice() 方法和 filter() 方法来从数组中返回满足指定条件的元素。

const arr = [1, 2, 3, 4, 5];
const newArr = arr.filter(x => x % 2 === 0); // [2, 4]

在上述示例中,filter() 方法用于过滤数组中的元素,只保留偶数。slice() 方法用于从过滤后的数组中返回指定范围内的元素。文章来源地址https://www.toymoban.com/news/detail-710247.html

到了这里,关于d3.shuffle、Fisher–Yates算法以及js 中的slice的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【模式识别】探秘判别奥秘:Fisher线性判别算法的解密与实战

    ​🌈个人主页: Sarapines Programmer 🔥 系列专栏: 《模式之谜 | 数据奇迹解码》 ⏰诗赋清音:云生高巅梦远游, 星光点缀碧海愁。 山川深邃情难晤, 剑气凌云志自修。 目录 🌌1 初识模式识别 🌌2 Fisher线性判别 🌍2.1 研究目的 🌍2.2 实验环境 🌍2.3 实验内容 🌕2.3.1 算法

    2024年02月04日
    浏览(29)
  • d3.js 的使用

    这篇文章相当于之前 svg 的补充。 因为 svg 代码肯定不是人为去专门写的。 在这里推荐制作 svg 的第三方库 - D3.js 用于定制数据可视化的JavaScript库 - D3 官网地址: D3 by Observable | The JavaScript library for bespoke data visualization 画个坐标轴吧! 效果图:

    2024年02月09日
    浏览(32)
  • D3.js(3) path/折线图

    path 元素是用来绘制各种形状(例如线条、曲线、弧形、圆弧等)的元素。 path 元素的 d 属性用来定义绘制的路径。具体来说, d 属性是一个字符串,包含一系列的命令和参数,用来描述路径的形状。 1.1 d属性 M=moveto(M x,y) 将画笔移到相对于svg的坐标位置 L=lineto(L x,y) 画直线到

    2023年04月24日
    浏览(25)
  • 如何使用前端绘图库(D3.js、Chart.js等)?

    聚沙成塔·每天进步一点点 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发者,这里都将为你提供一个系统而

    2024年02月08日
    浏览(30)
  • 前端数据可视化:D3.js的实践

    数据可视化是指将数据以图形、图表、图片的形式呈现给用户,以帮助用户更好地理解数据。随着数据的增长,数据可视化也越来越重要。前端数据可视化是指在网页上使用HTML、CSS、JavaScript等技术来呈现数据,以帮助用户更好地理解数据。D3.js是一个用于创建动态、交互式数

    2024年04月13日
    浏览(34)
  • vue3.0 + D3.js 实现拓扑绘图

      1. 首先,在项目中安装 D3.js 和 Vue 3.0: 2. Vue组件中引入 D3.js 3. 在 Vue 组件中定义一个 data 对象,用于存储拓扑结构的节点和边: 4. 在 Vue 组件的 mounted 生命周期中使用 D3.js 绘制拓扑结构: 5. 在 Vue 组件的 template 中添加一个 SVG 元素用于显示拓扑结构:  完整代码实现

    2024年02月13日
    浏览(42)
  • 如何正确使用 JavaScript 中的 slice() 方法

    在 JavaScript 中, slice() 是一个常用的数组方法,用于从现有数组中提取一部分元素,然后返回一个新的数组。它是一个非常有用的工具,可以帮助你在不改变原始数组的情况下操作数组的子集。本文将介绍 slice() 的基本概念、使用方法、实践案例和互动练习,以帮助你更好地

    2024年01月18日
    浏览(31)
  • Python中的切片(Slice)操作详解

    大家好,这里是果力成,话不多说,学之! 在python学习开发的过程中,我们难免会遇到从某个对象中抽取部分值的情况,对这种经常取指定索引的范围的操作,如果你使用循环的话是可以解决的,但是相对更好的方法而言,此操作是相当繁琐和费事的。 python中的 切片操作 正是专门用

    2024年02月01日
    浏览(36)
  • 【C++】STL 算法 - 排序算法 ( 合并排序算法 - merge 函数 | 随机排序算法 - random_shuffle 函数 | 反转序列算法 - reverse 函数 )

    在 C++ 语言 的 标准模板库 ( STL , STL Standard Template Library ) 中 , 提供了 merge 合并排序算法函数 用于 将 两个已排序好的容器 合并成一个新的已排序的容器 ; merge 合并排序算法 函数原型 如下 : 参数解析 : InputIterator1 first1 参数 : 有序 输入 容器 1 的 迭代器范围 的 起始迭代器 (

    2024年01月18日
    浏览(38)
  • js 常用函数 push()、pop()、shift()、unshift()、slice()、splice() 等

    最近对前端一些函数的用法还不是很熟悉,有一些函数容易混淆,在此总结一下,同时分享给各位小伙伴: join() 将数组中元素 组成字符串 ,需要传个参数作为连接符,不传的话默认就是逗号。 在数组 尾部逐个添加 元素,返回结果数组的长度,能接收任意数量参数,push(

    2024年02月02日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包