js 改进洗牌算法实现从数组中随机选取n个元素

洗牌算法原理:
1.倒序循环这个数组
2.取范围从1到n的随机数k
3.k与n交换
4.直到循环至数组的首个元素

原洗牌算法会将数组所有的元素打乱,我们可以在取到n个元素之后中止算法,进一步优化。

    let arrayShuflle = (arr, n) => {
        let copyArr = [...arr];
        let len = copyArr.length;
        if (len <= n) {
            return copyArr;
        }
        let result = [];
        let i, tem;
        while (len && result.length < n) {
            // 生成随机数
            let ranNum = Math.floor(Math.random() * len--);
            tem = copyArr[ranNum];
            copyArr[ranNum] = copyArr[len];
            copyArr[len] = tem;
            result.push(tem);
        }
        return result
    }
    let testAArr = [1, 2, 3, 4, 5, 6, 7, 8];
    let result = arrayShuflle(testAArr, 5);
    console.log('结果数组:', result );
    //结果数组: (5) [5, 1, 8, 6, 3]
    //结果数组: (5) [3, 2, 4, 1, 8] ......

你可能感兴趣的:(js 改进洗牌算法实现从数组中随机选取n个元素)