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
相关产品推荐
相关产品推荐

