洗牌算法(Fisher–Yates shuffle)

474 阅读1分钟
Fisher–Yates shuffle
  • 著名的洗牌算法:原理就是遍历数组元素,将当前元素与随机抽取的一个剩余元素进行交换
function shuffle(arr) {
    let newArr = [];
    for (let i = 0, len = arr.length; i < len; i++) {
        <!-- 随机抽取arr剩余元素中的某个值,下标为rIndex -->
        let rIndex = Math.floor(Math.random() * (len - i));
        <!-- 将抽取的值赋值给新数组 -->
        newArr[i] = arr[rIndex];
        <!-- 删除arr中抽取的项,保证每次都是从剩余元素中抽取,不重复 -->
        arr.splice(rIndex, 1);
    }
    <!-- 返回乱序后的数组 -->
    return newArr;
}

let arr = [1, 2, 3, 4, 5, 6];
console.log(shuffle(arr));