js random获取随机数,获取任意范围内随机整数

 壹 git

想着很久没作笔试题了,去GitHub找了面试相关的项目,结果被第一道题难住了.....说难其实也不难,而是我忘记了取范围随机整数怎么写了,不能否认若是当时是我在笔试,确定也凉了,那么就由这道题引出本文。github

对了,若是你要取范围整数的方法,请跳到文章尾部,但若是你想知道为何这么写,请阅读本文,那么原本开始:面试

题目来源数组

 贰  关于random()dom

若要取随机整数,前提得知道数组API中的Math.random()方法能取0--1的随机数,它的范围是[0,1)也就是取包括0但不包括1的随机数。spa

其次,数组API中有一个Math.floor()方法表明向下取整,Math.floor(X)的表明的是取≤ X 且最接近X的整数。code

那么咱们能够经过Math.random()先取得随机数,再经过乘法计算获得大体范围,最后经过Math.floor()进行取整加工就能够达到目的了。blog

1.取[n,m)范围随机整数get

好比,我要取 [0,100) 范围的随机整数,包括0但不包括100:it

//[0,1)*100 => [0,100) 范围是0-99.99999...随机数
Math.random() * 100;
//向下取整加工,范围变成 0-99
Math.floor(Math.random() * 100);

0-100好理解一点,那咱们怎么取 [2,32) 之间随机整数呢,思路相同:

当random取到0时,咱们但愿最后结果是2,因此须要有个加2的操做,那么32的状况只能拆分红30 + 2,因此应该是先乘法获得30,再有个加2的操做,像这么写:

Math.floor(Math.random() * 30) + 2;

结合上面2个例子,咱们大概能够得出一个规律,取 [n,m) 包括n但不包括m的随机整数公式

Math.floor(Math.random() * (m-n)) + n;

2.取[n,m]范围随机整数

如何取得包含n且包含m的随机整数呢,咱们仍是以好计算的[0,100]为例子。

按照前面的写法没法取到100,怎么办呢,咱们直接在计算时获得一个100.99999,而后向下取整不就是100了,因此咱们须要在乘以100的基础上再加上一个1。

须要注意的是加1操做的不能在random乘法计算完以后,你想一想若是是乘完后加1,假设random乘法获得0再加个1,那最少的数字就是1了,因此加1必须是在乘法的时候加,因此应该是这样:

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

这样根据 [0,1) 的范围算出来的范围就是 [0,101),由于不包括101,因此就是[0,100]了。

 针对 [2,23] 呢,简单分析一波,random是0时,咱们但愿获得2;假设random能够是1,咱们但愿得算出一个24才行,这样向下取整就能包含23了。

根据上面的分析,因此咱们得让random乘法获得一个22,而后再加一个2,应该这么写:

Math.floor(Math.random() * 22) + 2;

咱们大概能够获得一个规律,求 [n,m] 范围内的随机整数时,应该这样:

Math.floor(Math.random() * (m - n + 1)) + n;

那么取范围随机整数问题解决了,咱们来解决那道笔试题:

let arr = new Array(5);
function randomArr(i = 0, min = 2, max = 32) {
    let num = Math.floor(Math.random() * (max - min + 1)) + min;
    if (!arr.includes(num)) {arr[i] = num;i++;};
    return i < 5 ? randomArr(i) : arr;
};
let result = randomArr();

没超过十五行,虽然 if 这里没换行,看着不太美观,试了下,彻底没问题,那么咱们成功解决了这个问题。

 叁  玩点花样

既然知道了如何取范围内随机数,查了下,颜色强度范围是 [0-255] ,那么咱们来作个随机变色的背景图。

function random(min = 0, max = 255) {
    return Math.floor(Math.random() * (max - min + 1)) + min;
};

function randomColor() {
    let r = random(),
        g = random(),
        b = random();
    return `rgb(${r},${g},${b})`;
};
let color = randomColor();

而后,咱们作出这么个东西:

 肆 

 那么写到这,咱们掌握了这些知识:

1.Math.random()可用来获取 [0,1) 范围的随机数,包括0但不包括1。

2.Math.floor()可对数字进行向下取整,取整规则是小于等于且最接近该数字的整数。

3.取 [n,m) 范围的随机整数通用公式

Math.floor(Math.random() * (m-n)) + n;

4.取 [n,m] 范围的随机整数通用公式

Math.floor(Math.random() * (m - n + 1)) + n;

5.如何利用取范围随机整数来获取随机颜色。

那么本文先结束,留个问题,为何取整数不能使用round方法,或者ceil方法呢,为何要使用floor方法?

相关文章
相关标签/搜索