随机洗牌:将一组有序的或者无序的数组元素打乱输出。
思路:遍历原来数组的每一项让它跟选择到的随机的数组元素进行位置互换,达到了打乱的效果。
代码:
// 生成随意的值得到随机元素
function getRandomIndex(min, max) {
// [0,1) * max-min+min ==> [0,max-min+min) => [0,max+1) => [0,max]
return Math.floor(Math.random() * (max - min + 1) + min);
}
// 打乱算法
function shuffle(arr) {
let _arr = arr.slice(); // 打个副本
for(let i = 0; i < _arr.length; i++) {
let j = getRandomIndex(0, i); // 这里使用index的原因是因为希望不要将未遍历到的元素交换到前面去,尽可能的减少每个元素的交换次数,达到更随机的目的。(其实直接写arr.length也是一个效果)
let temp = _arr[i]; // 这三行代码应该很熟悉,就是交换元素
_arr[i] = _arr[j];
_arr[j] = temp;
});
return _arr
}
console.log(shuffle([1, 2, 3, 4, 5, 6, 7]))
总结:最主要的就是生成区间内的随机数然后进行元素的交换