javascript - 在 Javascript 中生成一个随机整数,不包括数字数组

标签 javascript

我想生成一个特定范围(最小值、最大值)内的随机整数。

但排除数组中的任何数字。

我有这样一个函数:

function randomInt(min, max) { // min and max included 
   return Math.floor(Math.random() * (max - min + 1) + min);
}

我想添加一个名为 exclude 的第三个参数,我会在其中传递 [3, 5, 6] 这样的数字,而这些数字是不可能的返回。

如果范围内的所有数字都被排除(在这种情况下有可能),那么它应该返回 false。

我想做一个 while 循环 while exclude.indexOf(random_number) > -1 然后生成一个随机数,直到它找到一个尚未被使用的数字,但我不确定如何检测它何时用尽所有可能的选项并且我们知道范围内的每个数字都被排除在外。

最佳答案

考虑构建一个数组,其中包含数组中除数字之外的范围。如果该数组的长度为 0 个元素,则您还没有任何选择。然后,您可以选择数组的随机索引。

function randomInt(min, max, exclude) {
   const nums = [];
   for (let i = min; i <= max; i++) {
      if (!exclude.includes(i)) nums.push(i);
   }
   if (nums.length === 0) return false;

  const randomIndex = Math.floor(Math.random() * nums.length);
  return nums[randomIndex];
}

console.log(randomInt(1, 5, [2, 3]))

为了完整起见,这里有一个更有效的解决方案,它使用 Set 作为排除列表,这样我们就不必使用数组 includes 方法,这可能会导致很多问题额外的迭代。

function randomInt(min, max, exclude) {
  const nums = [];
  const excludeLookup = new Set(exclude);
  for (let i = min; i <= max; i++) {
    if (!excludeLookup.has(i)) nums.push(i);
  }
  if (nums.length === 0) return false;

  const randomIndex = Math.floor(Math.random() * nums.length);
  return nums[randomIndex];
}

console.log(randomInt(1, 5, [2, 3]))

关于javascript - 在 Javascript 中生成一个随机整数,不包括数字数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57639315/

相关文章:

javascript - 根据 href 将 <a> 目标更改为 "_blank"

javascript - Parsley 远程验证码验证

javascript - 如何在标识符中使用 % 符号

javascript - JavaScript 中的 Math.max 函数

javascript - 使用 Javascript 验证多项选择单选按钮

javascript - 在 node.js/express 中处理 <select> 表单参数

javascript - AngularJS 无法连接 Controller 实例

javascript - 为什么 Angular 摘要循环在 UI 事件、$timeout 和 $http 上不同?

javascript - 如何根据选定的下拉项目生成项目列表?

javascript - 引用错误: variable not defined