// 使用函数打包一个数组,该数组包含范围内的所有不重复的数字// 传入一个值时,该值小于零时,范围为该值到1,大于零则为1到该值。// 传入两个值时,范围为小值到大值function nonRerandom (...num) {// 定义最小值,最大值 和用来包含随机数的数组let minNum, maxNumconst 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.lengthwhile (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]
