小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
这篇文章主要是记录下工作中的问题踩坑,写下自己的解决方法。日拱一卒嘛。
欢迎大佬指正、优化,巨佬求绕过~~
生成随机数
随机数在工作中还是比较常用的,当然生成 0 ~ 9 之间随机数很简单,使用 Math 对象方法 Math.floor(Math.random() * 10) 就可以实现简单的业务需求。
如果需要 0 ~ 99 之间的随机数,可以像下面这样将乘数设为 100,但是在 10 ~ 99 之间呢?
Math.floor(Math.random() * 100);
也就是说我只想要两个数字,多的不要,少的不行。
由于 Math.random() 这个方法可能会随机出类似 0.01、0.001、0.0001...这些数字。
也就是说在随机出 0.01 时,再使用上面的方法会出现少一位的情况。
面向CV编程的我,想着其他开发者肯定也遇到过这种情况。于是就先去百度一下吧🥱
功夫不负有心人(手动doge),是有解决办法的,就是这样:
function randomNum(n) {
let value = '';
for (let i = 0; i < n; i++) {
value += Math.floor(Math.random() * 10);
}
return value;
}
这个函数的执行原理很简单,就是使用文章开头的方法生成一个随机数最后再用字符串拼接。
妙蛙~ 不过数字位数是够了,但是格式还不太理想。所以这个函数也能实现需求,不过只适用于大多数情况。
因为是利用字符串拼接的格式,所以可能包含以数字0开头的情况。如果你的需求是做字符串拼接的话,可以用这种格式。
由于业务原因,我需要转成数字类型。当然我说的不是用 Number() 转换一下,这样转换完成之后位数还是不对的。
改进思路
回到最初我们遇到的问题,Math.random() 可能会随机出 0.01 这样甚至更小的数字。
所以,最简单的方法其实就是在返回前执行一个判断就 ok
当你需要一位数时,那返回值必定是一个小于10的整数。
当你需要两位数时,那返回值必定是一个小于100,大于或等于10的整数。
...
所以如果返回的最终值 value 小于给定的位数 10^(n-1),让函数重新执行一次就好辣🌶
function _randomInt(n) {
if (n <= 0) return -1; // 只能输入正整数哦
const limit = Math.pow(10, n);
let value = Math.floor(Math.random() * limit); // 用随机数向下取整,避免多一位
if (value < (limit / 10) && value !== 0) { // 取一位的时候就用不到这个函数啦,不过还是要把 0 这个小朋友放行的
return _randomInt(n);
}
return value
}