为何仍生成重复值?已做唯一性校验的随机数生成问题
问题分析与修复方案
原代码的核心问题
- 判断逻辑完全错误:数组里存的是
B+数字的字符串(比如B7),但你用arr.includes(randomNum)检查的是原始数字(比如7),两者根本不匹配,所以这个判断永远认为数字不存在,不管是否重复都会往数组里塞,自然出现重复值。 - else分支逻辑无效:
return generateRandomNumber(min, max)会直接终止整个循环,而且min和max在这里没有定义,会直接报错;就算生成了新数字,也没处理把它加入数组的逻辑。 - 循环计数逻辑缺陷:遇到重复数字时,循环的
i还是会递增,最后可能数组凑不够5个元素,也没重新生成有效数字。
修复后的代码
const arr = []; // 把生成函数移到循环外,避免重复定义 function generateRandomNumber(min, max) { return Math.floor(Math.random() * (max - min + 1) + min); } // 用while循环更合理,直到数组凑够5个唯一元素 while (arr.length < 5) { const randomNum = generateRandomNumber(1, 15); const targetItem = `B${randomNum}`; // 检查数组里是否已有这个拼接后的字符串 if (!arr.includes(targetItem)) { arr.push(targetItem); } } console.log(arr);
修复说明
- 将随机数生成函数移到循环外部,避免每次循环重复定义函数,提升代码效率。
- 改用
while循环,以数组长度是否达到5作为终止条件,确保最终能得到5个唯一的目标元素。 - 先拼接出
B+数字的字符串,再检查数组中是否存在该字符串,判断逻辑准确。 - 去掉原代码中错误的return逻辑,遇到重复值时会自动重新生成随机数,直到找到未存在的元素为止。
内容的提问来源于stack exchange,提问作者Nikita
相关产品推荐
相关产品推荐

