洗牌算法原理:
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] ......