天天看點

實作數組的随機排序(含洗牌算法)

有時,我們需要将一個數組内的元素順序進行打亂,達到随機排序的目的。首先想到的是

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));
           

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

繼續閱讀