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

问题描述 投票:3回答:2

我需要具有随机非重复值的数组。我发现用includes()解决但我想要没有它。

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;
}
javascript arrays
2个回答
3
投票

您可以利用ES6 Set的强大功能轻松完成此任务。由于您正在寻找数组输出,您可以简单地使用Array.from并传入集合以从函数返回。这是它的样子:

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

1
投票

如果ES6不是一个选项,您可以将随机数转换为对象的String键,并利用对象不允许重复属性的事实,如下所示:

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

© www.soinside.com 2019 - 2024. All rights reserved.