请求帮助:使用JavaScript生成10个不重复随机数
生成10个不重复随机数的解决方案
嘿,我来帮你搞定这个问题!你的代码目前的问题是循环次数和目标生成的10个数没有绑定,而且随机数的范围随着j变化,导致可能凑不够10个不重复的数。咱们调整一下逻辑,确保每次都能精准生成10个不重复的随机数,这里给你两种实用的方案:
方法1:循环生成直到满足数量
这个方法逻辑直观,适合快速上手:
// 初始化空数组存储结果 const randomNumbers = []; // 目标生成10个数 const targetCount = 10; // 随机数范围:1到21(和你原代码的范围一致) const min = 1; const max = 21; // 只要数组长度没到10,就继续生成 while (randomNumbers.length < targetCount) { // 生成1到21之间的随机整数 const num = Math.floor(Math.random() * (max - min + 1)) + min; // 检查数是否已存在,不存在就加入数组 if (!randomNumbers.includes(num)) { randomNumbers.push(num); } } console.log(randomNumbers); // 输出10个不重复的随机数
为什么这个能行? 它直接以“凑够10个不重复数”为终止条件,不管循环多少次,直到数组长度达标为止,完全保证结果数量。
方法2:Fisher-Yates洗牌法(更高效)
如果你的随机数范围不大(比如1到21),这种方法性能更好,而且不用反复检查重复:
// 先创建包含1到21的完整数组 const numbersArray = Array.from({ length: 21 }, (_, 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]]; } return array; } // 打乱数组后取前10个元素 const randomNumbers = shuffleArray(numbersArray).slice(0, 10); console.log(randomNumbers);
优势是什么? 先把所有可能的数列出来,打乱顺序后直接取前10个,从根源上避免了重复,而且比反复检查的循环更高效,尤其当目标数量接近总范围时。
对你原代码的小分析
你原来的循环是从1到21,每次生成1到j的随机数,这会导致前期生成的数范围很小,重复概率高,就算循环完21次,也可能凑不够10个不重复的数。上面两种方法都解决了这个问题,选哪种全看你的需求~
内容的提问来源于stack exchange,提问作者Mariusz
相关产品推荐
相关产品推荐

