【JS】Math对象的常用方法,通过Math.random取得各种范围内的随机数

abs()

  • 用途:求绝对值。

  • 语法:Math.abs(x)

  • 注意:Math.abs()Math 的一个静态方法,应该通过 Math.abs() 调用。(Math 不是构造器)

  • MDN参考:Math.abs()

  • 示例:

    Math.abs('-1');     // 1
    Math.abs(-2);       // 2
    Math.abs(null);     // 0
    Math.abs("string"); // NaN
    Math.abs();         // NaN
    

ceil()

  • 用途:返回大于等于给定数字的最小整数。

  • 语法:Math.ceil(x)

  • MDN参考:Math.ceil()

  • 示例:

    Math.ceil(-1.0)  // -1
    Math.ceil(-2.5)  // -2
    Math.ceil(3.5)  // 4
    

floor()

  • 用途:返回小于等于给定数字的最大整数。

  • 语法:Math.floor(x)

  • MDN参考:Math.floor()

  • 示例:

    Math.floor(-1.0)  // -1
    Math.floor(-2.5)  // -3
    Math.floor(3.5)  // 3
    

round()

  • 用途:返回四舍五入后的整数。

  • 语法:Math.round(x)

  • 注意点:只要碰到 0.5 的情况,不管是正数还是负数,都相当于向正无穷取整

  • MDN参考:Math.round()

  • 示例:

    x = Math.round(20.49)  // 20
    x = Math.round(20.5)   // 21
    x = Math.round(-20.5)  // -20
    x = Math.round(-20.51) // -21
    

max()

  • 用途:返回所有参数当中的最大值。

  • 语法:Math.max(value1[,value2, ...]) [,value]的写法指此部分为非必填项)

  • 注意点:

    如果没有参数,返回 -Infinity
    如果有任一参数不能被转换成数值,则返回 NaN

    为什么返回-Infinity而不是Infinity?

    当多个数组进行比较时,当其中一个数组比较后得出-Infinity,可以继续用Math.max()与其他结果比较:

    const arr1 = []
    const arr2 = [2,1,4]
    let max1 = Math.max(...arr1) // -Infinity
    let max2 = Math.max(...arr2) // 4
    console.log(Math.max(max1, max2)) // 4
    
  • MDN参考:Math.max()

  • 示例:

    Math.max(1, 4, 2, 8, 5, 7)  // 8
    Math.max(...[1, 4, 2, 8, 5, 7])  // 8
    

min()

  • 用途:返回所有参数当中的最小值。

  • 语法:Math.min([value1[,value2, ...]])

  • 注意:如果没有参数,返回 Infinity;如果有任一参数不能被转换为数值,则返回 NaN为什么返回-Infinity而不是Infinity? 与上面Math.max同理

  • MDN参考:Math.min()

  • 示例:

    Math.min(1, 4, 2, 8, 5, 7)  // 1
    Math.min(...[1, 4, 2, 8, 5, 7])  // 1
    

pow()

  • 用途:返回基数的指数次幂。
  • 语法:Math.pow(base, exponent)
  • MDN参考:Math.pow
  • 示例:
    Math.pow(2, 7)  // 128
    

random()

  • 用途:生成从0到小于1伪随机数,不包括 1, [0, 1)
  • 语法:Math.random()
  • 注意点:
  1. 虽然是伪随机数,但是Math.random()的分布仍然是均匀分布,如果进行 Math.random() * Math.random()会导致不均匀分布
    在这里插入图片描述

  2. Math.random() 函数返回一个浮点数, 伪随机数在范围(0, 1), 其生成的不能提供像密码一样安全的随机数字(黑客可以计算出客户端生成的的随机数)。
    不要使用它们来处理有关安全的事情。
    使用Web Crypto API 来代替, 和更精确的window.crypto.getRandomValues() 方法。

    建议使用加密强伪随机数生成器:

    // crypto需要考虑浏览器兼容
    const crypto = window.crypto || window.webkitCrypto || window.mozCrypto || window.oCrypto || window.msCrypto;
    crypto.getRandomValues(new Uint32Array(1));
    

    Crypto.getRandomValues() 方法让你可以获取符合密码学要求的安全的随机值。
    传入参数的数组被随机值填充(在加密意义上的随机)。

  • MDN参考:Math.random()

  • 示例:

    ex. 得到一个大于等于0,小于1之间的随机数: [0, 1)

    function getRandom() {
      return Math.random();
    }
    

    ex. 得到一个两数之间的随机数:[min, max)

    function getRandomArbitrary(min, max) {
      return Math.random() * (max - min) + min;
    }
    

    ex. 得到 [min,max] (min,max) (min,max] 范围内的随机数

    //取得[min,max]范围内随机数
    function fullClose(min, max){
    	// [min, max + 1)
        let result = Math.random() * (max + 0.01 - min) + min;
        while(result > max){
            result = Math.random() * (max + 0.01 - min) + min;
        }
        return result;
    }
    function fullClose(n,m){
        let result = Math.random()*(m+1-n)+n;
        while(result>m){
            result = Math.random()*(m+1-n)+n;
        }
        return result;
    }
    
    //取得(min,max)范围随机数
    function fullOpen(min, max){
    	// [min, max)
        let result = Math.random() * (max - min) + min;
        while(result == min){
            result = Math.random() * (max - min) + min;
        }
        return result;
    }
    
    //取得(min,max]范围随机数
    function leftOpen(min, max){
    	// [min, max + 0.01)
        let result = Math.random() * (max + 0.01 - min) + min;
        while(result > max || result == min) {
            result = Math.random() * (max + 0.01 - min) + min;
        }
        return result;
    }
    // 下方方法貌似不对
    function leftOpen(min, max){
    	// [min - 1, min - 1 + (max + 1 - min)) ==> [min - 1, max)
        let result = Math.random() * (max + 1 - min) + min - 1;
        while(result < min) {
            result = Math.random() * (max + 1 - min) + min - 1;
        }
        return result;
    }
    

    ex. 得到一个两数之间的随机整数: [min(int), max(int))

    function getRandomInt(min, max) {
      min = Math.ceil(min);
      max = Math.floor(max);
      return Math.floor(Math.random() * (max - min)) + min; //不含最大值,含最小值
    }
    

    也许很容易想到用 Math.round() 来实现,但是这会导致你的随机数处于一个不均匀的分布,这可能不符合你的需求。

    ex. 得到一个两数之间的随机整数,包括两个数在内:[min(int), max(int)]

    function getRandomIntInclusive(min, max) {
      min = Math.ceil(min);
      max = Math.floor(max);
      return Math.floor(Math.random() * (max - min + 1)) + min; //含最大值,含最小值 
    }
    

参考文章:

JavaScript 内置对象 Math 的常用方法
Math.random() 二三事
不要再使用Math.random()生成随机数

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值