如何生成指定长度的不重复的随机数组?

968 阅读1分钟
/**
 * 返回一个指定范围内的随机整数
 * @param {number} min 最小值
 * @param {number} max 最大值
 */
function getRandom(min, max) {
  return Math.round(Math.random() * (max - min) + min)
}

/**
 * 返回一个指定长度的,元素值在指定范围内的随机数数组
 * @param {number} length 长度
 * @param {number} min 最小值
 * @param {number} max 最大值
 * @param {Array<number>} result 初始化数组,长度不能大于目标长度
 * @return {Array<number>}
 */
function getRandomArray(length, min, max, result) {
  const range = max - min + 1
  if (range < 1) throw new Error('Invalid range: Maximum must be bigger than minimum')
  if (range < length) throw new Error('Invalid range: Range must be bigger than length')
  if (result.length > length) throw new Error('Invalid target length: Target length must be bigger than initialization array length')

  for (let index = 0; index < length; index++) {
    result.push(getRandom(min, max))
  }

  result = [...new Set(result)]

  if (result.length < length) return getRandomArray(length, min, max, result)
  else return result
}