以数组为参数并生成随机数的函数

时间:2019-07-09 21:24:54

标签: javascript arrays function parameters

首先,不能使用任何内置方法。例如sortpop()。我可以使用的仅仅是循环,数组等。

我想创建一个函数,该函数将数组作为参数并生成随机的数字字符串,其中不包含数组中给出的这些数字。

例如,shift()(2和6将不存在)。 数组长度可能会更改(func([6, 2]) //=> "20353"[6, 2, 9])。因此,该函数必须能够容纳任意长度的数组。

为了解决这个实践问题,我使用了[7, 2, 1, 9]for循环。但是,我遇到一个问题,当检查第二个索引(在示例中,是否随机生成的数字是否包含2),如果包含第二个索引,我将重新生成随机数,并可能生成第一个索引号(在此示例中)情况下,6)我不想要的。

请参阅我在下面发布的代码,并帮助我解决该问题。最重要的是,如果还有另一种获得相同结果的方法是更好的方法,请也告诉我。

while

预期输出:

let str = "";
let arr = [];
let tem

const func = arg2 => {
  for (let i = 0; i < 5; i++) {
    arr[i] = Math.floor(Math.random() * 10);
  }

  for (let i = 0; i < arr.length; i++) {
    for (let v = 0; v < arg2.length; v++) {
      if (arg2[v] == arr[i]) {
        do {
          tem = Math.floor(Math.random() * 10);
        } while (tem == arr[i])
        arr[i] = tem;
      }
    }
  }

  for (let i = 0; i < arr.length; i++) str += arr[i]
  return str
}

console.log(func([6, 2]))

// the output will not contain 2, which is the last index element
// however, when the second index number is removed, the output might replace it with 6, which is the first index element

4 个答案:

答案 0 :(得分:2)

首先,您已经使用了两种本机方法(myJsonObjectfloor),但我假设您对此表示满意。

第二,在您的问题中,术语数字在某些情况下比数字更合适。有区别...

为避免仍然选择不允许的数字,可以首先使用仍然允许的数字构建一个数组,然后从那个数组中随机选择值。这样一来,您永远不会选错人。

这是它的外观:

random

只是为了好玩,如果您取消了对不能使用哪些语言方面的限制,可以按以下步骤进行操作:

const func = arg2 => {
    const digits = [0,1,2,3,4,5,6,7,8,9];
    // Mark digits that are not allowed with -1
    for (let i=0; i<arg2.length; i++) {
        digits[arg2[i]] = -1;
    }
    // Collect digits that are still allowed
    const allowed = [];
    for (let i=0; i<digits.length; i++) {
        if (digits[i] > -1) allowed[allowed.length] = digits[i];
    }
    // Pick random digits from the allowed digits
    let str = "";
    for(let i=0; i<5; i++) {
        str += allowed[Math.floor(Math.random() * allowed.length)];
    }
    return str;
}

console.log(func([6, 2]));

答案 1 :(得分:0)

每次选择一个随机数字时,您都需要遍历整个arg2数组。您无法替换arg2循环中的值,因为那样您就不会检查以前的元素了。

您不需要arr数组,可以在循环中附加到str

const func = arg2 => {
  let str = "";
  let arr = [];
  for (let i = 0; i < 5; i++) {
    let random;
    while (true) {
      let ok = true;
      random = Math.floor(Math.random() * 10);
      for (let j = 0; j < arg2.length; j++) {
        if (random == arg2[j]) {
          ok = false;
          break;
        }
      }
      if (ok) {
        break;
      }
    }
    str += random
  }

  return str
}

console.log(func([6, 2]))

答案 2 :(得分:0)

我怀疑您对此太想了。基本算法是:

  • 循环中:
    • 如果输出有5位数字,请将其返回。
    • 否则
      • 选择0到9之间的一个随机数字 n
      • 如果排除数字列表中的 n 不是不是,则它将输出

这很直接地映射到以下功能:

function fn(exclude, length = 5) {
  let output = '';
  while (output.length < length) {
    const n = Math.floor(Math.random() * 10)
    if (!exclude.includes(n)) {
      output += n;
    }
  }
  return output;
}

console.log(fn([6,3,8]));

当然,还有其他方法可以实现此目的,例如初始化包含五个元素的数组,然后join元素:

function fn(exclude, length = 5) {
  return Array.from({ length }, () => {
    let n;
    while (n = Math.floor(Math.random() * 10), exclude.includes(n)) {}
    return n;
  }).join('');
}

console.log(fn([6,3,8]));

答案 3 :(得分:0)

除了您自己使用本机数组方法的事实(其他人也说过)之外,我可能还会使用类似的方法(仅使用到目前为止使用的方法):

const func = without => {
    let result = '';

    while (result.length < 5) {
        let rand = Math.floor(Math.random() * 10);
        let add = true;

        for (i=0; i<without.length; i++) {
            if (rand === without[i]) {
                add = false;
            }
        }

        if (add) {
            result += rand;
        }
    }

    return result;
}

console.log(func([6, 2]))

使用本机数组方法的更简洁的版本如下所示:

const func = without => {
    let result = '';

    while (result.length < 5) {
        let rand = Math.floor(Math.random() * 10);

        if (!without.includes(rand)) {
            result += rand;
        }
    }

    return result;
}

console.log(func([6, 2]))