一、使用Math.random()打亂數組順序
一種簡單的方法是使用Math.random()函數。代碼如下:
function shuffle(arr) {
return arr.sort(() => Math.random() - 0.5);
}
代碼中的sort()方法會根據回調函數的返回值進行排序,因此在每次排序時,都會隨機生成一個0到1的小數,如果小於0.5,則順序不變,如果大於0.5,則會交換位置,達到打亂數組順序的目的。
這種方法的缺點是無法保證完全均勻的打亂順序,可能會出現某些元素始終在數組的固定位置上。
二、使用洗牌算法打亂數組順序
洗牌算法也稱為Fisher-Yates算法,步驟如下:
1. 從最後一個元素開始,對於每一個元素,生成一個隨機數作為索引。
2. 將當前元素與隨機索引位置的元素交換。
3. 重複上述步驟,直到第一個元素。
代碼實現如下:
function shuffle(arr) {
for (let i = arr.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[arr[i], arr[j]] = [arr[j], arr[i]];
}
return arr;
}
這種方案可以到達更完全的均勻打亂順序的效果,因為每個元素的位置都有可能在每個位置。而且該算法還具有良好的時間複雜度,只需要一個for循環即可實現。
三、使用Array.sort()與隨機數打亂數組順序
在第一種方法中,我們使用sort()方法來排序數組,從而達到打亂順序的目的。如果我們想要保留這種方法,同時又想要更好的打亂效果,可以結合隨機數。代碼如下:
function shuffle(arr) {
return arr.sort(() => 0.5 - Math.random());
}
這樣可以保持sort()方法的應用,同時加入隨機的影響,達到更好的隨機打亂效果。同樣的,這種方法也存在一定的不足,即儘管概率較小,但是有可能產生某段順序被打亂後滿足順序排列的情況。
四、使用ES6的解構語法打亂數組順序
在ES6中,我們可以使用解構語法很方便地打亂數組順序。代碼如下:
function shuffle(arr) {
let newArr = [...arr];
for (let i = newArr.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[newArr[i], newArr[j]] = [newArr[j], newArr[i]];
}
return newArr;
}
使用ES6的解構語法可以更優雅地打亂數組順序,同時也可以保持完全隨機的打亂順序。
五、使用Durstenfeld洗牌算法打亂數組順序
在Fisher-Yates算法中,要實現對數組的打亂需要從後向前掃描數組,這意味着算法使用了隨機訪問(Random Access),因此效率不高。提高效率的一個傳統方法是隨機交換算法,即Durstenfeld洗牌算法。Durstenfeld洗牌算法是一種優化、更簡單的Fisher-Yates洗牌算法。
代碼實現如下:
function shuffle(arr) {
for (let i = arr.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[arr[i], arr[j]] = [arr[j], arr[i]];
}
return arr;
}
該算法最大的優勢就在於不需要對數組進行兩次隨機訪問和緩存外部隨機訪問。
六、使用Lodash庫的shuffle方法打亂數組順序
Lodash是一個一致性、模塊化、高性能的JavaScript實用工具庫。該庫提供了非常多的函數來幫助我們處理JavaScript中的常見問題,包括數組的隨機打亂。
使用Lodash提供的shuffle方法可以很容易地實現數組順序打亂,代碼如下:
const _ = require('lodash');
const arr = [1, 2, 3, 4, 5];
const shuffledArr = _.shuffle(arr);
console.log(shuffledArr);
使用Lodash庫可以非常便捷地實現打亂數組的目的,且Lodash的shuffle方法實現也是非常優秀的。
原創文章,作者:EDYHB,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/333048.html