题目:
写一个函数打乱一个数组,传入一个数组,返回一个打乱的新数组。
以上题目,考察的是数组的随机排序,也称为“洗牌算法”
基本思路
洗牌算法的思路是:
先从数组末尾开始,选取最后一个元素,与数组中随机一个位置的元素交换位置。然后在已经排好的最后一个元素以外的位置中,随机产生一个位置,让该位置元素与倒数第二个元素进行交换。
代码实现
/**
返回一个新数组,数组乱序
从最后一位开始,将数据和其前面位置中随机一个数进行数字交换
从倒数第二位开始,数据和其前面位置中随机一个数进行数字交换
依次地,按照上诉逻辑共进行arr.length轮
*/
let arr = [1, 7, 6, 4, 8, 3, 2, 5]
function shuffle(arr){
//判断是否是数组
if(arr instanceof Array === false){
return
}
let newArr = Array.from([...arr])//复制一个新数组
for(let i=newArr.length-1;i>0;i-- ){
//获取[1,arr.length-1]直接的随机数,包含最大和最小值
// Math.floor(Math.random()*(max-min+1)+min)
const randomIndex = Math.floor(Math.random()*(i+1))
//newArr[i]和newArr[randomIndex]交换位置
const tmp = newArr[i];
newArr[i] = newArr[randomIndex];
newArr[randomIndex] = tmp
}
return newArr
}
shuffle(arr)
相关题目
1.写一个函数打乱一个数组,传入一个数组,返回一个打乱的新数组。
2.需要实现一个小功能:有一个数组,当每次刷新时,数组会随机重新排序生成新的 数组。
3.从一个长度为n的数组中随机选择m个数
4.有一个长度为 100 的数组,如何从中随机挑选 50 个元素,组成一个新的数组?