我需要具有随机非重复值的数组。我发现用includes()解决但我想要没有它。
CODE
function rand(min, max){
return Math.round( Math.random() * (max - min) + min);
}
function getRandArray(n, min, max) {
//n - array length
var randArr = [];
randArr[0] = rand(min, max);
for (var i = 0; i < n; i++) {
var randNum = rand(min, max);
for (var j = 0; j < randArr.length; j++){
if (randNum != randArr[j])
randArr[i] = randNum;
else
randNum = rand(min, max);
}
}
return randArr;
}
答案 0 :(得分:3)
您可以利用ES6 Set的强大功能轻松完成此任务。由于您正在寻找数组输出,因此您只需使用function rand(min, max){
return Math.round( Math.random() * (max - min) + min);
}
function getRandArr(n, min, max) {
var set = new Set();
// ensure that the number of unique numbers they want is possible
var maxNumsInArr = Math.min(n, max-min+1);
while(set.size < maxNumsInArr) {
set.add(rand(min, max));
}
return Array.from(set);
}
console.log(getRandArr(10, 0, 10));
console.log(getRandArr(5, 100, 399));
console.log(getRandArr(5, 0, 2)); // only 3 possible unique values, so length will be 3
并传入该集合即可从函数返回。这就是它的样子:
CookieManager
&#13;
答案 1 :(得分:1)
如果ES6不是一个选项,您可以将随机数转换为对象的字符串键,并利用对象不允许这样的重复属性这一事实:
function rand(min, max){
return Math.round( Math.random() * (max - min) + min);
}
function getRandArr(n, min, max) {
if (n > (max - min + 1)) {
throw "Cannot create array of size " + n;
}
var res = {};
while (Object.keys(res).length < n) {
var r = rand(min, max);
res[r] = true;
}
var array = Object.keys(res);
return array;
}
console.log(getRandArr(100, 0, 10000));
在获得结果后,您总是可以通过一次传递将字符串数组转换回数字。
向对象添加属性将使用属性名称的哈希值,因此您可以获得O(1)时间来检查该数字是否唯一。