原生js实现数组随机排列(数组乱序)的方法.【快速洗牌算法】

摘要:在开发中遇到这样的问题,需要将一组已知数组的顺序打乱,按照以前和现在的做法,总结了以下方法。

在开发中遇到这样的问题,需要将一组已知数组的顺序打乱,按照以前和现在的做法,总结了以下方法:

(1)时间复杂度约为 O(n2),splice()方法会遍历一次

function shuffle(a) {
    var b = [];
    while (a.length > 0) {
        var index = parseInt(Math.random() * (a.length - 1));
        b.push(a[index]);
        a.splice(index, 1);
    }
    return b;
}


(2)时间复杂度为 O(n)

function shuffle(a) {
    var len = a.length;
    for (var i = 0; i < len - 1; i++) {
        var index = parseInt(Math.random() * (len - i));
        var temp = a[index];
        a[index] = a[len - i - 1];
        a[len - i - 1] = temp;
    }
}


(3)Array.prototype.sort 随机算法【慎用】

function shuffle(arr){
    return arr.sort(function(){
        return Math.random() - 0.5;
    });
}

该方法看似巧妙利用了 Array.prototype.sort 实现随机,但是结果发现:各个位置的平均值越往后越大,这意味着这种随机算法越大的数字出现在越后面的概率越大。 


本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!

链接: https://shenqiku.cn/article/FLY_439