数组乱序的方法

275 阅读1分钟

题目:给定一个数组[0,1,2,3,4,5,6,7,8,9],请你将它随机打乱。

解析:

看到题目,我们首先会关注到随机二字,那么可以用 Math.random()来控制随机的方式,具体怎么打乱呢有两种办法

  1. 足够随机的 random + sort(),通过随机排序来实现打乱数组
  2. 高度随机的洗牌算法(Fisher-Yates),从数组末尾开始,依次将每个元素与前面随机选取的一个元素进行交换,直到遍历完整个数组。这种方法可以确保每个元素都有机会被交换到任意位置,从而实现真正的随机打乱。

编码:

1、random + sort

function randomArr(arr){
    return arr.sort(()=> 0.5 - Math.random());
}
console.log(new Array(10).fill(-1).map(item=> randomArr([0,1,2,3,4,5,6,7,8,9])))

image.png

2、洗牌算法

function randomArr2(arr){
    for(let i = arr.length-1; i>0; i--){ // i 没有0的情况是因为从后往前的交换次数够了,比如交换两个数,从后往前交换一次就够了
        const j = Math.floor(Math.random()*(i+1)); // i+1 是因为有向下取整,不加1的话乘积结果最大是arr.length-2是不对的
        [arr[i],arr[j]] = [arr[j],arr[i]];
    }
    return arr;
}
console.log(new Array(10).fill(-1).map(item=> randomArr2([0,1,2,3,4,5,6,7,8,9])))

image.png