zoukankan      html  css  js  c++  java
  • js random获取随机数,获取任意范围内随机整数

     壹 

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

    对了,如果你要取范围整数的方法,请跳到文章尾部,但如果你想知道为什么这么写,请阅读本文,那么本文开始:

    题目来源

     贰  关于random()

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

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

    那么我们可以通过Math.random()先取得随机数,再通过乘法计算得到大致范围,最后通过Math.floor()进行取整加工就可以达到目的了。

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

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

    //[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,32] 呢,简单分析一波,random是0时,我们希望得到2;假设random可以是1,我们希望得算出一个33才行,这样向下取整就能包含32了。

    根据上面的分析,所以我们得让random乘法得到一个31,然后再加一个2,应该这么写:

    Math.floor(Math.random() * 31) + 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方法?

    若有兴趣,请阅读博主 为何随机取整要用floor,而非ceil或round呢

  • 相关阅读:
    sort_action
    jedis
    ClassNotFoundException
    mysql-test-run.pl
    mysql 5.6 bug
    The basic principle of test case 修改引擎
    mysql 执行计划走索引
    mysql 执行计划走索引
    14.1.2 Checking InnoDB Availability 检查InnoDB 可用性:
    14.1.2 Checking InnoDB Availability 检查InnoDB 可用性:
  • 原文地址:https://www.cnblogs.com/echolun/p/11177832.html
Copyright © 2011-2022 走看看