常用的洗牌算法,后来发现很多元素都在原来的位置,所以并不是真正的随机排序
function shuffle(arr) {
arr.sort(() => Math.random() - 0.5)
}
原因出在sort上面,
Array.proptotype.sort(comparefn)
comparefn(a, b) 对比同一组的a, b 要求返回总是相同的,而Math.random() - 0.5肯定是不总相同
不使用sort排序,可以使用这个原地的洗牌方法,不需要另外声明数组,节省内存
function shuffle(arr) {
for(i=0;i<arr.length;i++) {
let j = i + Math.floor(Math.random() * (arr.length - i));
[arr[j], arr[i]] = [arr[i], arr[j]];
}
}
第二种
function shuffle2(arr) {
_arr = [];
while(arr.length) {
const randomIndex = Math.floor(Math.random() * arr.length);
_arr.push(arr.splice(randomIndex, 1)[0]);
}
return _arr;
}
参考资料