首页 > 其他分享 >写个方法随机打乱一个数组

写个方法随机打乱一个数组

时间:2024-11-24 17:48:12浏览次数:10  
标签:写个 const 打乱 shuffledArray 数组 array shuffleArray Math

function shuffleArray(array) {
  // 创建数组的副本,避免修改原始数组
  const shuffledArray = [...array];
  
  // Fisher-Yates 洗牌算法
  for (let i = shuffledArray.length - 1; i > 0; i--) {
    const j = Math.floor(Math.random() * (i + 1)); // 随机索引 0 到 i
    [shuffledArray[i], shuffledArray[j]] = [shuffledArray[j], shuffledArray[i]]; // 交换元素
  }

  return shuffledArray;
}


// 示例用法:
const originalArray = [1, 2, 3, 4, 5];
const shuffled = shuffleArray(originalArray);
console.log("Original array:", originalArray); // 输出原始数组,保持不变
console.log("Shuffled array:", shuffled); // 输出打乱后的数组


//  简化版 (如果可以直接修改原数组)
function shuffleArrayInPlace(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]];
  }
}

// 示例用法
const myArray = [1, 2, 3, 4, 5];
shuffleArrayInPlace(myArray);
console.log("Shuffled array in place:", myArray);


// 使用sort方法的变种 (不推荐 - 分布不均匀)
//  虽然简洁,但由于sort的实现机制,这种方法的随机性不够理想,可能导致某些排列出现的概率更高。
function shuffleArraySort(array) {
  return array.sort(() => Math.random() - 0.5);
}

解释:

  • shuffleArray(array): 这个版本创建了原数组的副本,并在副本上进行洗牌,保持原始数组不变。 这是推荐的做法,因为它避免了副作用。

  • shuffleArrayInPlace(array): 这个版本直接修改传入的数组。 如果你确定要修改原始数组,可以使用这个版本,它更节省内存。

  • shuffleArraySort(array): 这个版本使用 sort 方法和一个随机比较函数。 虽然代码简洁,但它不推荐,因为 sort 方法的随机比较函数会导致分布不均匀,某些排列出现的概率会更高,从而降低随机性。

  • Fisher-Yates 洗牌算法: shuffleArrayshuffleArrayInPlace 使用了 Fisher-Yates 洗牌算法 (也称为 Knuth 洗牌算法)。 这是公认的生成均匀随机排列的有效算法。 它的核心思想是从数组的最后一个元素开始,随机选择一个之前的元素与其交换位置。 然后,对倒数第二个元素重复此过程,依此类推,直到处理完第二个元素。

选择哪个版本取决于你的具体需求。 如果你需要保持原始数组不变,使用 shuffleArray。 如果你可以修改原始数组并且想要节省内存,使用 shuffleArrayInPlace避免使用 shuffleArraySort ,因为它不能保证真正的随机性。

标签:写个,const,打乱,shuffledArray,数组,array,shuffleArray,Math
From: https://www.cnblogs.com/ai888/p/18566043

相关文章

  • 关于C语言 字符串(字符数组)s
    关于charC语言中的字符型用关键字char表示,它实际存储的是ASC码。字符常量可以用单引号法表示。在语法上可以把字符当做int型使用。字符串的实际长度每次存储字符串,应多分配字符个数加1,因为C语言的字符串被读取后会添加空字符"\0"结尾例如:存储"2357"到chara[20]中,a会存储......
  • Java学习笔记--对象数组,方法参数,命令行参数,快速生成方法
    目录一,对象数组Personp=newPerson();二,方法参数1.基本数据类型做方法参数传递2.引用数据类型做方法参数传递三,命令行参数四,快速生成方法1.快速生成方法2.快速将一段代码抽取到一个方法中 一,对象数组Person[]arr=newPerson[3];Personp=newPerson();......
  • 【一维数组】排名(rank)
    题目描述小X很关心自己在学校的表现。班主任手上有一本“个人得分记录本”,如果一位同学表现好就会加分,表现差则会扣分。学期结束,每位同学都得知了自己的个人得分。小X想知道其他同学情况如何,但由于排名不公布,他只好一个个去问班里的其他同学。现在,小X手上有班里共 N ......
  • [数组双指针] 0015. 三数之和
    文章目录1.题目链接2.题目大意3.示例4.解题思路5.参考代码1.题目链接15.三数之和-力扣(LeetCode)2.题目大意描述:给定一个整数数组nums。要求:判断nums中是否存在三个元素a、b、c,满足a+b+c==0。要求找出所有满足要求的不重复的三元组。说明:3≤n......
  • 两个有序数组合并
    #include<stdio.h>intmain(){intm;scanf("%d",&m);inta[m];for(inti=0;i<m;i++){scanf("%d",&a[i]);}intn;scanf("%d",&n);intb[n];for(inti=0;i&l......
  • 数据结构-链表、栈、动态数组、队列
    数据结构文章目录数据结构不透明指针定义优点应用场景不透明指针的实现定义不透明指针类型链表知识点节点(Node)头节点(Head)尾节点(Tail)单向链表双链表动态数组队列队列的链式存储队列的顺序存储栈栈的顺序存储栈的链式存储不透明指针定义不透明指针是指指向一个......
  • 2024年华为OD机试真题-数组拼接-Python-OD统一考试(E卷)
    最新华为OD机试考点合集:华为OD机试2024年真题题库(E卷+D卷+C卷)_华为od机试题库-CSDN博客     每一题都含有详细的解题思路和代码注释,精选c++、JAVA、Python三种语言解法。帮助每一位考生轻松、高效刷题。订阅后永久可看,发现新题及时跟新。题目描述现在有多组整数数组,需......
  • JS中使用new Array()与使用Array.from()方式创建二维数组的性能比较
    比较1,单次创建小额数组:1.通过newArray()方式functiont(){console.time();newArray(100).fill().map(()=>newArray(10));console.timeEnd();} 执行5次耗时:0.078125ms0.050048828125ms0.0380859375ms0.031005859375ms0.093017578125ms2.......
  • LeetCode---JZ85 连续子数组的最大和(二)
    示例代码importjava.util.*;publicclassSolution{publicint[]FindGreatestSumOfSubArray(int[]array){//记录到下标i为止的最大连续子数组和的最大值int[]dp=newint[array.length];dp[0]=array[0];intmaxsum=......
  • 《贪婪算法实战:寻找最短无序连续子数组的深度解析与实现》
    ......