實現陣列的隨機排序(含洗牌演算法)

小珥_Boy發表於2019-03-05

有時,我們需要將一個陣列內的元素順序進行打亂,達到隨機排序的目的。首先想到的是 Math.random() 方法結合陣列的 sort() 方法。

Math.random() 結合 sort() 方法

Math.random() 方法用於產生一個介於 0 和 1 之間的隨機數(含 0 但不包括 1)。

陣列的 sort() 方法可以有兩種用法:

用法一:在不傳入可選的函式引數時,將會對陣列的每一個元素應用 toString() 方法,通過比較字串大小的方式升序排列所有的陣列項。

用法二:編寫比較函式並作為引數傳入,假設有以下比較函式(補充一點關於下面引數 a、b 的說明,若 a 為陣列的第一個元素,則 b 為第二個元素,依次類推……),

function compare (a, b) {
  // 省略一些程式碼……
  return val;
}
複製程式碼

如果你想將 a 變數排列在變數 b 的前面位置,則比較函式返回負數(即上述 val 為負數);若想將 a 變數排列在變數 b 的後面,則返回正數(即上述 val 為正數);若不需要改變 a、b 變數之間的順序,則返回 0(即上述 val 為 0)。

因此有了以下程式碼:

var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
arr.sort(function (a, b) {
  return Math.random() - 0.5;
});
console.log(arr);
複製程式碼

洗牌演算法

上述方法比較簡單,且程式碼量少,短小精悍。這裡我再講一種比上面複雜一些的洗牌演算法,通過它也能達到陣列隨機排序的效果。那下面就開講啦~

首先是要明白它的洗牌原理,該演算法需要遍歷整個陣列,當遍歷到第 i(i 為陣列元素的索引)個元素時,從 0 到 i 隨機挑選出一個數字,記為 index,然後對索引為 i 和 index 的陣列元素進行互換,直至遍歷結束。如此下來,也即完成了陣列的隨機排序。來看下程式碼吧:

var arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
function shuffle (arr) {
  var len = arr.length;
  for (var i = 0; i < len; i++) {
    // 生成 0 到 i 之間的隨機整數
    var index = Math.floor(Math.random() * (i + 1));
    // 使用 ES6 中的解構賦值完成兩個變數值的交換
    [arr[i], arr[index]] = [arr[index], arr[i]];
  }
  return arr;
}
console.log('Shuffled arr: ', shuffle(arr));
複製程式碼

以上就是我目前想到的兩種方法,在這裡分享給大家,若有不足之處,請予以指出,感謝!

相關文章