十二、案例:封装函数,获取一个范围内的随机整数

92 阅读4分钟

一、获取0~10范围内的随机整数

1.分析:

  • 利用random可以获取一个 0 ~ 0.999 之间的随机小数。
  • 将随机获取到的小数 * 10 ,就会得到一个0 ~ 9.999之间的随机小数
  • 利用round将扩大十倍后的小数四舍五入取整,就会得到0 ~ 10 之间的随机整数。
  1. 代码如下:
var num = Math.round(Math.random() * 10)
console.log(num)
  1. 此时显现问题:概率不均衡,如下:
  • 当随机小数在 0~0.4999 之间时,四舍五入取整后为:0;
  • 当随机小数在 0.5~1.4999 之间时,四舍五入取整后为:1;
  • 当随机小数在 1.5~2.4999 之间时,四舍五入取整后为:2;
  • ......
    
  • 当随机小数在 8.5~9.4999 之间时,四舍五入取整后为:9;
  • 当随机小数在 9.5~9.999 之间时,四舍五入取整后为:10;

由上述分析可知,取整后为0和10的概率相对来说是较小的,很明显在这里使用四舍五入取整是不合适的。

  1. 改进上述方法:由上述分析可知,四舍五入取整是不合适的,那么我们就应该选取别的取整方式,目前可以选择的取整方式有:ceil(向上取整)、floor(向下取整)。
  • 当选择ceil向上取整时,要想获取到 0 ~ 10 之间的随机整数 ,那么随机小数的取值范围就在 -0.999 ~ 9.999 之间。(涉及到负数,较为麻烦,暂时不考虑)
  • 当选择floor向下取整时,要想获取到 0 ~ 10 之间的随机整数 ,那么随机小数的取值范围就在 0 ~ 10.999 之间。
  • 那么此时再次出现问题,如果此时将拿到的随机小数扩大十倍,10 ~ 10.999 之间的小数无法拿到,也就是说,无法向下取整得到整数10。
  • 想要解决这个问题,我们把拿到的随机小数扩大十一倍便可拿到 0 ~ 10.999 之间的小数了。
  1. 修改后的代码如下:
var num = Math.floor(Math.random() * 11)   
//修改两个地方:将四舍五入取整改为向下取整,将扩大十倍改为扩大十一倍
console.log(num)
//此时拿到的数字就是0 ~ 10 之间概率相等的随机整数

二、获取0~20范围内的随机整数

  • 根据上述分析,我们可以得知,要使用向下取整,同时放大的倍数要改为21,才能获取到 0 ~ 20 之间的随机整数(如果放大20倍,整数20取不到)
  • 代码如下:
var num = Math.floor(Math.random() * 21)   
console.log(num)

其实看到这里,我们就可以找出规律了,当在0 到一个整数之间随机获取整数时,放大的倍数是:这个整数+1

  • 代码如下:
//需求:获取 0 ~ X 内的随机整数
var num = Math.floor(Math.random() * (x + 1) )   
console.log(num)

三、获取10~20范围内的随机整数

  1. 分析:
  • 先拿到 0 ~ 10 之间的随机整数;
  • 将拿到的随机整数 + 10
  • 代码如下:
var num = Math.floor(Math.random() * (11) ) + 10 
console.log(num)

四、获取10~30范围内的随机整数

  1. 分析:
  • 先拿到 0 ~ 20 之间的随机整数;
  • 将拿到的随机整数 + 10
  • (如果还是先拿到0~10之间的随机整数,那么下一步无论加多少都不满足条件)
  • 代码如下:
var num = Math.floor(Math.random() * (21) ) + 10 
console.log(num)

五、获取20~30范围内的随机整数

  1. 分析:
  • 先拿到 0 ~ 10 之间的随机整数;
  • 将拿到的随机整数 + 20
  • (如果还是先拿到0~20之间的随机整数,那么下一步无论加多少都不满足条件)
  • 代码如下:
var num = Math.floor(Math.random() * (11) ) + 20 
console.log(num)

通过上述分析我们依然可以发现一个规律:

  • 想要获取10~20范围内的随机整数:先拿到 0 ~ 10 之间的随机整数,然后将拿到的随机整数 + 10;
  • 想要获取10~30范围内的随机整数:先拿到 0 ~ 20 之间的随机整数,然后将拿到的随机整数 + 10;
  • 想要获取20~30范围内的随机整数:先拿到 0 ~ 10 之间的随机整数,然后将拿到的随机整数 + 20;
  • .....
  • 想要获取X~Y范围内的随机整数:先拿到 0 ~ (Y - X) 之间的随机整数,然后将拿到的随机整数 + X;

六、封装函数,获取X~Y范围内的随机整数

  • 通过上述分析,代码的逻辑已经清楚:
//2.封装函数
function fn(X,Y){
   //1.拿到X ~ Y范围内的随机整数
   var num = Math.floor(Math.random() * (Y - X + 1) ) + X
   return num
}
var result = fn(X,Y)
console.log(result)