随机非重复数组JS(没有.includes()求解)

时间:2017-12-20 19:13:55

标签: javascript arrays

我需要具有随机非重复值的数组。我发现用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;
}

2 个答案:

答案 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并传入该集合即可从函数返回。这就是它的样子:

&#13;
&#13;
CookieManager
&#13;
&#13;
&#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)时间来检查该数字是否唯一。

相关问题