如何生成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
相关产品推荐
相关产品推荐

