首页 > 其他分享 >如何快速让一个数组乱序,写出来

如何快速让一个数组乱序,写出来

时间:2024-11-21 12:33:39浏览次数:1  
标签:myArray let currentIndex 数组 array 快速 乱序

在前端 JavaScript 中,快速打乱数组顺序最常用的方法是使用 sort 方法结合一个随机比较函数:

function shuffleArray(array) {
  return array.sort(() => Math.random() - 0.5);
}

// 示例用法:
let myArray = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let shuffledArray = shuffleArray(myArray);
console.log(shuffledArray); // 输出乱序后的数组

解释:

  • array.sort() 方法默认会按升序排列数组元素。
  • 通过传入一个比较函数,我们可以自定义排序逻辑。
  • Math.random() - 0.5 会生成一个介于 -0.5 和 0.5 之间的随机数。
  • 如果比较函数返回一个负数,sort 方法会将第一个元素排在第二个元素之前;如果返回正数,则将第二个元素排在第一个元素之前;如果返回 0,则保持两个元素的相对顺序不变。
  • 由于 Math.random() - 0.5 的结果是随机的,因此 sort 方法会以随机的顺序排列数组元素,从而实现乱序效果。

注意事项:

  • 虽然这种方法很简洁常用,但它并非真正的随机乱序,因为 sort() 方法的底层实现可能会影响随机性,导致某些排列出现的概率更高。对于需要更严格随机性的场景,建议使用 Fisher-Yates 洗牌算法。
  • 该方法会直接修改原数组。如果需要保留原数组,需要先创建一个副本:
let myArray = [1, 2, 3, 4, 5];
let shuffledArray = shuffleArray([...myArray]); // 使用扩展运算符创建副本
console.log(myArray); // 原数组保持不变
console.log(shuffledArray); // 乱序后的数组

Fisher-Yates 洗牌算法 (更均匀的随机性):

function fisherYatesShuffle(array) {
  let currentIndex = array.length,  randomIndex;

  // While there remain elements to shuffle.
  while (currentIndex != 0) {

    // Pick a remaining element.
    randomIndex = Math.floor(Math.random() * currentIndex);
    currentIndex--;

    // And swap it with the current element.
    [array[currentIndex], array[randomIndex]] = [array[randomIndex], array[currentIndex]];
  }
  return array;
}

let myArray = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let shuffledArray = fisherYatesShuffle(myArray);
console.log(shuffledArray);

Fisher-Yates 洗牌算法能保证每个元素在每个位置出现的概率相等,因此能产生更均匀的随机排列。 如果对随机性要求较高,建议使用 Fisher-Yates 洗牌算法。

标签:myArray,let,currentIndex,数组,array,快速,乱序
From: https://www.cnblogs.com/ai888/p/18560432

相关文章

  • 说说你对arguments的理解,它是数组吗?
    在前端开发中,arguments对象是一个类数组对象,它包含了传递给函数的所有参数。虽然它看起来像数组,并且可以使用类似数组的索引访问其中的元素(例如arguments[0]访问第一个参数),但它并不是真正的数组。以下是arguments对象的一些关键特性:类数组:arguments拥有length属性,表......
  • 用递归算法实现,数组长度为5且元素的随机数在2-32间不重复的值
    functiongenerateRandomArray(length,min,max){if(max-min+1<length){thrownewError("Rangeistoosmalltogenerateanarraywithoutduplicates.");}functionrecursiveHelper(arr){if(arr.length===length){......
  • SpringBoot中小企业人事管理:快速开发指南
    第4章系统设计4.1系统体系结构中小企业人事管理系统的结构图4-1所示:图4-1系统结构登录系统结构图,如图4-2所示:图4-2登录结构图中小企业人事管理系统结构图,如图4-3所示。图4-3中小企业人事管理系统结构图4.2开发流程设计系统流程的分析是通过调查系统所涉及......
  • 使用minikube快速搭建一个简单的golang微服务访问
    先在宿主机的docker下载一下golang的最新镜像dockerpullgolang:test写个简单的服务器,监听7878端口,请求都返回hello,worldpackagemainimport("fmt""net/http""os")funcmain(){fmt.Println("startmain")http.HandleFunc(&q......
  • typeScript 数组类型(五)
    typeScript数组类型声明分默认数组类型和数组泛型声明,下面一一介绍基础数组类型声明//声明数组类型全数字类型letarr:number[]=[1,2,4,5,7]//这么写会报错的不可以指定字符串类型作为数组的值letarr1:number[]=[1,2,3,4,'23323']//解决上面的类型......
  • 用递归算法实现,数组长度为5且元素的随机数在2-32间不重复的值
    functiongenerateRandomArray(length,min,max){if(max-min+1<length){thrownewError("Rangeistoosmalltogenerateanarraywithoutduplicates.");}functionrecursiveHelper(arr){if(arr.length===length){......
  • 除自身以外数组的乘积
    除自身以外数组的乘积题目给你一个整数数组nums,返回数组answer,其中answer[i]等于nums中除nums[i]之外其余各元素的乘积。题目数据保证数组nums之中任意元素的全部前缀元素和后缀的乘积都在32位整数范围内。请不要使用除法,且在O(n)时间复杂度内完成此题。......
  • 5.C语言数组(上)
    文章目录一、数组的概念二、一维数组的创建和初始化2.1数组的创建2.2数组的初始化2.3数组的类型三、一维数组的使用3.1数组下标3.2数组元素的打印3.3数组的输入四、一维数组在内存中的存储五、sizeof计算数组元素的个数六、二维数组的创建6.1二维数组的概念6.2......
  • yolo --- 快速上手
     命令行下载好ultralytics项目并安装好ultralytics项目后,可以直接使用命令行(CommandLineInterface,CLI)进行快速推理一张图片、视频、视频流、摄像头等等,举个例子:yolo任务名称model=本地模型权重路径source=图片路径yolopredictmodel=yolov8n.ptsource='https:/......
  • docker快速安装
    docker快速安装[root@docker-server~]#yuminstallwget.x86_64-y[root@docker-server~]#rm-rf/etc/yum.repos.d/*[root@docker-server~]#wget-O/etc/yum.repos.d/Centos-7.repohttp://mirrors.aliyun.com/repo/Centos-7.repo[root@docker-server~]#wget-O/et......