一个简单的洗牌算法

一、背景需求

最近在开发音乐播放网站的时候,遇到“随机播放”的需求
需要知道的是,播放列表是以数组的形式存储的
当切换到“随机播放”时,我们需要对这个数组进行“洗牌”,任意地交换其中的元素
可以将这个功能封装在common目录下

二、具体实现(Javascript)

首先我们需要写一个 生成指定区间内的随机数 的函数
因为数组索引都是整数,所以我们需要对随机的结果再向下取整

// 返回一个(min,max]之间的随机数
function getRandomInt(min, max) {
  return Math.floor(Math.random() * (max - min + 1) + min)
}

Math.random( )会生成一个(0,1)之间的Number

然后我们需要遍历数组,对每个元素
令其与一个索引为随机数的元素进行交换

export function shuffle(arr) {
  for (let i = 0; i < arr.length; i++) {
    let j = getRandomInt(0, i)
    let t = arr[i]
    arr[i] = arr[j]
    arr[j] = t
  }
  return arr
}

在js中,这样会直接修改arr指向的内存地址中的数组内容
如果需要保存原来的数组,可以对这个函数稍作修改

export function shuffle(arr) {
  // 保存数组的副本,不直接对数组本身进行修改
  let __arr = arr.slice()
  for (let i = 0; i < __arr.length; i++) {
    let j = getRandomInt(0, i)
    let t = __arr[i]
    __arr[i] = __arr[j]
    __arr[j] = t
  }
  return __arr
}
posted @ 2020-10-15 21:26  BAEBAE996  阅读(113)  评论(0编辑  收藏  举报