You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何生成1-100范围内不重复的随机数?附初始代码求方案

实现1-100不重复随机数(最多100次)的解决方案

当然有可行的实现方案!你当前的代码能生成1-100的随机数,但没法避免重复,我给你两种实用的改进思路,分别适用于不同场景:

方法一:基于现有代码的改进(重复检查法)

这种方法适合你想在原有代码基础上快速修改的场景,核心是维护一个已生成数字的集合,每次生成新数时检查是否已经存在,直到拿到未出现过的数:

// 用数组存储已经生成过的随机数,避免重复
const generatedNumbers = [];

function getUniqueRandomNumber() {
  // 当已经生成100个数时,说明1-100全用完了,停止生成
  if (generatedNumbers.length >= 100) {
    console.log("所有1-100的数字都已生成完毕");
    return null;
  }

  let randomNum;
  // 循环生成,直到拿到未重复的数
  do {
    randomNum = Math.floor(Math.random() * 100) + 1;
  } while (generatedNumbers.includes(randomNum));

  // 将新生成的数加入记录数组
  generatedNumbers.push(randomNum);
  console.log(randomNum);
  return randomNum;
}

// 示例:调用5次生成5个不重复随机数
for (let i = 0; i < 5; i++) {
  getUniqueRandomNumber();
}

这个方法逻辑简单,修改成本低,但如果接近生成完100个数时,重复概率会变高,循环次数可能增加,适合生成次数较少的场景。

方法二:Fisher-Yates洗牌法(高效全量不重复)

如果需要生成大量甚至全部100个不重复数,这种方法效率更高。思路是先创建1-100的完整数组,用经典的Fisher-Yates算法打乱顺序,之后每次从数组末尾取出一个数,天然保证不重复:

// 初始化1-100的数字池
let numberPool = Array.from({ length: 100 }, (_, index) => index + 1);

// Fisher-Yates洗牌函数,高效打乱数组顺序
function shuffleArray(array) {
  for (let i = array.length - 1; i > 0; i--) {
    const j = Math.floor(Math.random() * (i + 1));
    // 交换当前元素和随机选中的元素
    [array[i], array[j]] = [array[j], array[i]];
  }
}

// 先打乱数字池
shuffleArray(numberPool);

function getUniqueRandomNumber() {
  // 数字池为空时,说明所有数都已取出
  if (numberPool.length === 0) {
    console.log("所有1-100的数字都已生成完毕");
    return null;
  }
  // 从数组末尾取出一个数(pop操作时间复杂度为O(1),效率高)
  const randomNum = numberPool.pop();
  console.log(randomNum);
  return randomNum;
}

// 示例:调用10次生成10个不重复随机数
for (let i = 0; i < 10; i++) {
  getUniqueRandomNumber();
}

这种方法不需要每次生成后检查重复,性能更稳定,尤其适合需要生成大部分甚至全部数字的场景。

内容的提问来源于stack exchange,提问作者zgg6a

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:25:17