JS生成固定位数的随机数

4,635 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

这篇文章主要是记录下工作中的问题踩坑,写下自己的解决方法。日拱一卒嘛。

欢迎大佬指正、优化,巨佬求绕过~~

生成随机数

随机数在工作中还是比较常用的,当然生成 0 ~ 9 之间随机数很简单,使用 Math 对象方法 Math.floor(Math.random() * 10) 就可以实现简单的业务需求。

如果需要 0 ~ 99 之间的随机数,可以像下面这样将乘数设为 100,但是在 10 ~ 99 之间呢?

Math.floor(Math.random() * 100);

也就是说我只想要两个数字,多的不要,少的不行。

由于 Math.random() 这个方法可能会随机出类似 0.010.0010.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
}