如何实现生成1-10间不在指定数组中的随机数的JS函数
实现一个生成不在指定数组中的1-10随机数的函数
没问题,我来帮你搞定这个需求,顺便修正下你提供的示例代码里的小问题。首先明确需求:写一个以数组为参数的函数,持续生成1-10之间的随机数,直到得到一个不在传入数组里的数,然后返回这个数。
简洁的正确实现
这里用ES6的includes方法来简化判断,代码清晰易懂:
function getRandomNotInArray(arr) { let randomNum; // do...while确保至少生成一次随机数,再检查是否符合条件 do { // 生成1-10的随机数:Math.random()*10得到0~9.999...,取整后加1变成1~10 randomNum = Math.floor(Math.random() * 10) + 1; } while (arr.includes(randomNum)); // 如果数在数组里,继续循环生成新数 return randomNum; } // 测试用例 const testArray = [1, 2, 4, 7]; console.log(getRandomNotInArray(testArray)); // 会输出3、5、6、8、9、10中的一个
兼容旧环境的版本(不用ES6 includes)
如果需要兼容不支持includes的旧浏览器,可以自己写一个数组判断函数:
function isNumberInArray(arr, num) { for (let i = 0; i < arr.length; i++) { if (arr[i] === num) { return true; } } return false; } function getRandomNotInArray(arr) { let randomNum; do { randomNum = Math.floor(Math.random() * 10) + 1; } while (isNumberInArray(arr, randomNum)); return randomNum; }
说说你示例代码里的问题
你的contains函数有几个逻辑问题:
- 没有把数组作为参数传入,直接用全局
arr不是好的编程习惯,而且如果函数在其他地方调用时没有全局arr会报错; - 循环逻辑错误:一旦找到数组里存在的数,就直接
return false退出函数,没法继续生成新的随机数;check变量的设置也没起到循环迭代的作用,因为第一次匹配就直接return了,不会进入下一次while循环。
内容的提问来源于stack exchange,提问作者J. Thomas Dufey
相关产品推荐
相关产品推荐

