# 从数组随机获取指定个数非重元素
注意力放在两点:
- 一是针对结果,也就是最终结果,我只要100个随机的不重复的结果。那就只随机一个数字然后剔除掉随机范围,1000,999,998······一直到900为止。
- 二是针对随机数,毕竟是数组,index对应的就是0-999。我着重于随机出0-999内100个不同的随机数即可,随机一次,假设有十个重复,那就直接把90个没重复的剔除掉0-999范围,然后继续随机筛选,一直到有100个随机不同的数,也就是100个不同的index值,去1000个人员里面对应找出即可
解法:
- 快速生成一个巨大数组 使用Array.from()
- 通过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))