// 使用函数打包一个数组,该数组包含范围内的所有不重复的数字
// 传入一个值时,该值小于零时,范围为该值到1,大于零则为1到该值。
// 传入两个值时,范围为小值到大值
function nonRerandom (...num) {
// 定义最小值,最大值 和用来包含随机数的数组
let minNum, maxNum
const randomArr = []
// 判断最小值和最大值的具体顺序
if (num.length === 2) {
if (num[0] === num[1]) {
return num[0]
}
// 通过解构赋值 可以快速完成变量赋值,
[minNum, maxNum] = num[0] < num[1] ? [num[0], num[1]] : [num[1], num[0]]
} else {
if (num[0] === 1) {
return 1
}
[minNum, maxNum] = num[0] < 1 ? [num[0], 1] : [1, num[0]]
}
// 将最小值到最大值之间的全部整数循环写入数组中
for (let i = parseInt(minNum); i <= parseInt(maxNum); i++) {
randomArr.push(i)
}
// 将数组随机乱序 乱序后的数组 按顺序取出 即为非重随机数
let index = randomArr.length
// 取出数组中的最后一位数,并将之前的全部数字随机取出一位 交换,然后向前循环。循环结束后得到的数组即为乱序数组
while (index) {
const r = Math.floor(Math.random() * index--);
[randomArr[r], randomArr[index]] = [randomArr[index], randomArr[r]]
}
return randomArr
}
nonRerandom(32)
具体表现可点击查看
小小优化了下
function nonrandom (...num) {
if (Array.isArray(num[0])) { num = num[0] } // 判断得到的第一个参数是不是数组,如果是数组则将数组导出
let maxNum = parseInt(num[0]) || 10,
minNum = parseInt(num[1]) || 1; // 赋给边界的两个数字以默认的最大值和最小值
if (minNum === maxNum) { return maxNum } // 如果两值相等则返回
minNum > maxNum ? [minNum, maxNum] = [maxNum, minNum] : ''
let randomArr = [...Array(maxNum - minNum + 1).keys()].map(item => item + minNum )
let index = randomArr.length
while (index) {
const r = Math.floor(Math.random() * index--);
[randomArr[r], randomArr[index]] = [randomArr[index], randomArr[r]]
}
return randomArr
}
console.log(nonrandom()) // [9, 7, 8, 4, 6, 1, 5, 2, 10, 3]
console.log(nonrandom(20)) // [1, 7, 16, 15, 17, 3, 8, 9, 19, 10, 2, 18, 12, 6, 13, 20, 11, 14, 4, 5]
console.log(nonrandom(2, 20)) // [15, 2, 4, 7, 8, 10, 18, 16, 13, 12, 6, 5, 20, 19, 14, 17, 9, 3, 11]
console.log(nonrandom(['2', '20'])) // [17, 2, 14, 3, 16, 20, 11, 5, 19, 6, 7, 9, 12, 13, 4, 10, 18, 15, 8]