實現數組的隨機排序(含洗牌算法)

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

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

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

數組的 sort() 方法能夠有兩種用法:算法

用法一:在不傳入可選的函數參數時,將會對數組的每個元素應用 toString() 方法,經過比較字符串大小的方式升序排列全部的數組項。數組

用法二:編寫比較函數並做爲參數傳入,假設有如下比較函數(補充一點關於下面參數 a、b 的說明,若 a 爲數組的第一個元素,則 b 爲第二個元素,依次類推……),dom

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

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

所以有了如下代碼:ui

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);
複製代碼

洗牌算法

上述方法比較簡單,且代碼量少,短小精悍。這裏我再講一種比上面複雜一些的洗牌算法,經過它也能達到數組隨機排序的效果。那下面就開講啦~spa

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

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));
複製代碼

以上就是我目前想到的兩種方法,在這裏分享給你們,如有不足之處,請予以指出,感謝!排序

相關文章
相關標籤/搜索