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

JavaScript随机数生成器重复数字问题及最优方案咨询

解决1-60不重复随机数字生成问题

你的当前代码直接循环生成随机数并推入数组,没有检查数字是否重复,因此会出现重复值。下面提供两种最优解决方式:

方法一:检查重复值生成法(适合少量数字生成)

这种方法逻辑简单,每次生成随机数后检查是否已存在于结果数组中,仅当不存在时才加入,直到数组长度达到需求。

function sorteio() {
  const gerarNumerosEntre1a60 = (n) => {
    const resultado = [];
    while (resultado.length < n) {
      // 生成1-60的随机整数
      const num = Math.floor(Math.random() * 60 + 1);
      // 检查数字是否未在结果数组中
      if (!resultado.includes(num)) {
        resultado.push(num);
      }
    }
    return resultado;
  };

  // 用逗号分隔数字显示,提升可读性
  document.getElementById("resultado").innerHTML = gerarNumerosEntre1a60(6).join(", ");
}

方法二:Fisher-Yates洗牌法(高效严谨,推荐)

先创建1-60的完整数字数组,通过洗牌算法打乱顺序后截取前6个,从根源上避免重复,同时保证数字范围完整无缺失。这种方法在生成数量接近总范围时优势更明显,也不存在理论上的无限循环风险。

function sorteio() {
  // 构建1到60的完整数组
  const numeros = Array.from({ length: 60 }, (_, index) => index + 1);

  // Fisher-Yates洗牌算法:从后往前交换元素,实现公平打乱
  for (let i = numeros.length - 1; i > 0; i--) {
    const randomIndex = Math.floor(Math.random() * (i + 1));
    // 交换当前元素与随机位置的元素
    [numeros[i], numeros[randomIndex]] = [numeros[randomIndex], numeros[i]];
  }

  // 截取前6个不重复的随机数字
  const resultado = numeros.slice(0, 6);
  document.getElementById("resultado").innerHTML = resultado.join(", ");
}

HTML部分无需修改,保持原代码即可:

<button onclick="sorteio()">抽取数字!</button>
<h1 id="resultado"></h1>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 19:03:31