一、获取0~10范围内的随机整数
1.分析:
- 利用random可以获取一个 0 ~ 0.999 之间的随机小数。
- 将随机获取到的小数 * 10 ,就会得到一个0 ~ 9.999之间的随机小数
- 利用round将扩大十倍后的小数四舍五入取整,就会得到0 ~ 10 之间的随机整数。
- 代码如下:
var num = Math.round(Math.random() * 10)
console.log(num)
- 此时显现问题:概率不均衡,如下:
- 当随机小数在 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的概率相对来说是较小的,很明显在这里使用四舍五入取整是不合适的。
- 改进上述方法:由上述分析可知,四舍五入取整是不合适的,那么我们就应该选取别的取整方式,目前可以选择的取整方式有:ceil(向上取整)、floor(向下取整)。
- 当选择ceil向上取整时,要想获取到 0 ~ 10 之间的随机整数 ,那么随机小数的取值范围就在 -0.999 ~ 9.999 之间。(涉及到负数,较为麻烦,暂时不考虑)
- 当选择floor向下取整时,要想获取到 0 ~ 10 之间的随机整数 ,那么随机小数的取值范围就在 0 ~ 10.999 之间。
- 那么此时再次出现问题,如果此时将拿到的随机小数扩大十倍,10 ~ 10.999 之间的小数无法拿到,也就是说,无法向下取整得到整数10。
- 想要解决这个问题,我们把拿到的随机小数扩大十一倍便可拿到 0 ~ 10.999 之间的小数了。
- 修改后的代码如下:
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范围内的随机整数
- 分析:
- 先拿到 0 ~ 10 之间的随机整数;
- 将拿到的随机整数 + 10
- 代码如下:
var num = Math.floor(Math.random() * (11) ) + 10
console.log(num)
四、获取10~30范围内的随机整数
- 分析:
- 先拿到 0 ~ 20 之间的随机整数;
- 将拿到的随机整数 + 10
- (如果还是先拿到0~10之间的随机整数,那么下一步无论加多少都不满足条件)
- 代码如下:
var num = Math.floor(Math.random() * (21) ) + 10
console.log(num)
五、获取20~30范围内的随机整数
- 分析:
- 先拿到 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)