javascript实现乱序数组——洗牌算法

使用sort()函数实现

关于sort的使用,可以看这篇内容https://www.jianshu.com/p/80b814871ac7
sort方法中传入一个函数,

arr.sort(function(a, b){
    return a - b
})
return a-b的结果 ab的排序结果
负数 a排在b之前
0 不会进行排序
正数 b排在a的前面

结合这个函数的特点加上随机数,我们就可以实现一个乱序数组了

    var arr = [1, 2, 3, 4, 5]
    function ramdomArr(a, b){
      return Math.random() - 0.5
    }
    console.log(arr.sort(ramdomArr));

随机数是生成0-1之间的,我们用这个随机数去减0.5就会得到不同的正数和负数,再利用sort方法,就能实现一个乱序数组了。

Fisher–Yates shuffle洗牌算法

使用sort实现的乱序貌似是实现了,由于浏览器的对随机数实现机制,这种乱序并非真正意义上的乱序,目前最好的实现方式就是洗牌算法了
原理
首先从所有元素中随机选取一个与第一个元素进行交换,然后在第二个之后选择一个元素与第二个交换,直到最后一个元素
实现一

var arr = [1, 2, 3, 4, 5]
var shuffle = function (arr) {
  for (var i = arr.length - 1; i >= 0; i--) {
    var randomIndex = Math.floor(Math.random() * (i + 1));
    var itemAtIndex = arr[randomIndex];
    arr[randomIndex] = arr[i];
    arr[i] = itemAtIndex;
  }
  return arr;
}

var res = shuffle(arr)
console.log(res); // (5) [3, 5, 2, 1, 4]

实现二

var shuffle = function (arr) {
  var newArr = []
  while(arr.length != 0){
    var rand = Math.floor((Math.random() * arr.length))
    newArr.push(arr[rand])
    arr.splice(rand, 1)
  }
  return newArr
}

你可能感兴趣的:(javascript实现乱序数组——洗牌算法)