不重复的随机数
分享一个题目
题目:输入正整数n,返回1-n的n个随机的,且不重复
例如:输入4 返回3 2 4 1
- 比较原始的方法
const a = 12
let b = new Array(a)
for(let i = 0; i < b.length; i++) {
const c = parseInt(Math.random() * a) + 1
b.indexOf(c) === -1 ? b[i] = c : i--
}
console.log(b)
function ccf(e) {
let ary = [];
let newAry = [];
for (let i=0;i<e;){
let origin = Math.round(Math.random()*e) % e + 1;
if(!ary[origin]){
ary[origin] = origin;
newAry.push(origin);
i++;
}
}
return newAry
}
2.数组下标方法,性能快
// 方法一
const randomNum1 = n => {
let arr = [];
let temp;
for (let i = 0; i < n; i++) {
//生成1-n的数组
arr[i] = i + 1;
}
for (let j = 0; j < n; j++) {
//随机生成一个下标
let index = Math.floor(Math.random() * n);
//与数组的最后一个数交换位置,然后数组的总长度减一
// 每次生成的下标可能相同,但是对应数组里的数已经不同了
temp = arr[n - 1];
arr[n - 1] = arr[index];
arr[index] = temp;
n--;
}
return arr;
}
console.log(randomNum1(5));
// 方法二
const randomNum2 = n => {
let arr = [];
for (let i = 0; i < n; i++) {
//生成1-n的数组
arr[i] = i + 1;
}
// sort的排序规则,随机生成一个随机小数
arr.sort(function () {
return 0.5 - Math.random()
})
return arr;
}
console.log(randomNum2(5));
3.优化后的代码
const fn = (n) => {
let i, range, num = new Array(n).fill(1).map((val, inx) => inx + 1);
for (i = n - 1; i > 0; i--) {
range = Math.floor(Math.random() * i);
[num[i], num[range]] = [num[range], num[i]];
}
return num;
}
fn(10);