sort方法
let arr = [1,2,3,4,5,6,7,8,9,10];
arr.sort(()=>{
return 0.5-Math.random();
})
Fisher–Yates shuffle洗牌算法
首先我們有一個已經(jīng)排好序的數(shù)組
1 2 3 4 5 6 7 8 9
1.從數(shù)組末尾開始,選區(qū)最后一個元素
1 2 3 4 5 6 7 8 【9】
在數(shù)組一共 9 個位置中坪蚁,隨機(jī)產(chǎn)生一個位置奔穿,該位置元素與最后一個元素進(jìn)行交換,如下:
隨機(jī)產(chǎn)生的位置為【2】敏晤,即arr[2]
1 2 [3] 4 5 6 7 8 【9】
交換位置:
1 2 [9] 4 5 6 7 8 【3】
2.接下來從數(shù)組倒數(shù)第二個元素開始進(jìn)行上述操作:
現(xiàn)在數(shù)組如下括號內(nèi)代表已隨機(jī)后的元素:
1 2 9 4 5 6 7 【8】 (3)
在數(shù)組除去最后一元素的8 個位置中贱田,隨機(jī)產(chǎn)生一個位置,該位置元素與最后一個元素進(jìn)行交換嘴脾,如下:
隨機(jī)產(chǎn)生的位置為【5】男摧,即arr[5]
1 2 9 4 5 [6] 7 【8】 (3)
交換位置:
1 2 9 4 5 [8] 7 【6】 (3)
3.其實可以看到只要重復(fù)第一步操作,既可以將數(shù)組亂序排列
現(xiàn)在數(shù)組如下:
1 2 9 4 5 8 7 (6 3)
代碼是實現(xiàn)
function shuffle(arr) {
let length = arr.length,
randomIndex,
temp;
while (length) {
randomIndex = Math.floor(Math.random() * length--);
temp = arr[length];
arr[length] = arr[randomIndex];
arr[randomIndex] = temp;
}
return arr;
}
let arr = [1, 2, 3, 4, 5, 6, 7, 8];
console.log(shuffle(arr));
使用正向for循環(huán)
function shuffleFor(arr) {
let length = arr.length,
randomIndex,
temp;
for (var i = 0; i < length; i++) {
randomIndex = Math.round(Math.random() * (length - 1 - i)) + i;
temp = arr[i];
arr[i] = arr[randomIndex];
arr[randomIndex] = temp;
}
return arr;
}
let arr1 = [1, 2, 3, 4, 5, 6, 7, 8];
console.log(shuffleFor(arr1));
代碼可優(yōu)化:
temp = arr[length];
arr[length] = arr[randomIndex];
arr[randomIndex] = temp;
//可以這樣寫
[arr[randomIndex],arr[length]]=[arr[length],arr[randomIndex]]
優(yōu)化后
function shuffleSimple(arr) {
for (var i = 0; i < arr.length; i++) {
const randomIndex = Math.round(Math.random() * (arr.length - 1 - i)) + i;
[arr[i], arr[randomIndex]] = [arr[randomIndex], arr[i]];
}
return arr;
}
let arr2 = [1, 2, 3, 4, 5, 6, 7, 8];
console.log(shuffleSimple(arr2));