# 从数组随机获取指定个数非重元素

注意力放在两点:

  1. 一是针对结果,也就是最终结果,我只要100个随机的不重复的结果。那就只随机一个数字然后剔除掉随机范围,1000,999,998······一直到900为止。
  2. 二是针对随机数,毕竟是数组,index对应的就是0-999。我着重于随机出0-999内100个不同的随机数即可,随机一次,假设有十个重复,那就直接把90个没重复的剔除掉0-999范围,然后继续随机筛选,一直到有100个随机不同的数,也就是100个不同的index值,去1000个人员里面对应找出即可

解法:

  1. 快速生成一个巨大数组 使用Array.from()
  2. 通过Set特性,存放随机数,这里需要注意的是,没有就add,有就递归,总之要保证遍历的每一项都要找到一个唯一随机值,如果有就跳过就不能保证最后能获取到10k个值。
const randomNumHandle = (len, randomNum) => {
  // 快速生成一个有len个元素的巨大数组
  let originArr = Array.from({length: len}, (v, i) => i);
  let resultSet = new Set()

  // 快速选取randomNum个元素
  for(let i = 0; i < randomNum; i++) {
    addNum(resultSet, originArr)
  }

  function addNum () {
    let luckDog = Math.floor(Math.random() * (len - 1))

    if(!resultSet.has(originArr[luckDog])) {
      resultSet.add(originArr[luckDog])
    } else {
      addNum()
    }
  }

  return Array.from(resultSet)
}

// 比如有个数组有100K个元素,从中不重复随机选取10K个元素
console.log(randomNumHandle(100000, 10000))