zoukankan      html  css  js  c++  java
  • js获取[n,m]的随机整数值

    1.需要用到的方法:

    Math.random:取大于等于0到小于1之间的随机数;

    Math.floor:向下取整;

    Math.ceil:向上取整;

    2.看了一个面试题,要求有个函数fn,参数为n,需要返回[2,32]之间的n个整数。第一次写的时候如下:

    var fn=function(n){
        var arr=[],num;
        for(var i=0;i<n&&n<32;i++){
            num=Math.floor(Math.random()*30+2);
            if(arr.indexOf(num)===-1){
                arr.push(num);
            }else{
                i--;
            }
        }
        return arr;
    };
    var a=fn(3);
    console.log(a.sort());
    

      然后发现2到32包含2和32的时候是有31位数字的,在这里我取错了只是[2,32);然后才查了下random时大于等于0小于1的数,所以向下取整时始终是小于1*30+2的即32。

      而题目是要求包含2和32,我就想向上取整不就有了32,同时当随机数为0时也就有2了,就有了如下的代码:

    var fn=function(n){
        var arr=[],num;
        for(var i=0;i<n&&n<32;i++){
            num=Math.ceil(Math.random()*30+2);
            if(arr.indexOf(num)===-1){
                arr.push(num);
            }else{
                i--;
            }
        }
        return arr;
    };
    var a=fn(31);
    console.log(a.sort());

      然后运行,没有结果浏览器卡住了,类似陷入死循环。我想了下才发现自己犯了个很低级的错误,等于2的时候只有random的值为0,而如果随机数是随机的无法确保什么时候为0,如果一直没取到0,就会一直i--,直到有0为止。运气不好就会运行很久。所以改了代码如下:

    var fn=function(n){
        var arr=[],num;
        for(var i=0;i<n&&n<32;i++){
            num=Math.floor(Math.random()*31+2);
            if(arr.indexOf(num)===-1){
                arr.push(num);
            }else{
                i--;
            }
        }
        return arr;
    };
    var a=fn(31);
    console.log(a.sort());

      改成向下取整当random的值小于1/31时,向下取整为0,这样就得到2了,而这样的区间比只是一个0的概率大的多,而最大数始终小于1*31+2,向下取整后就是32。

      总结:

      a.Math.random是取[0,1)的数;

      b.取[min,max]的随机整数时使用如下公式:

      Math.floor(Math.random().(max-min+1)+min)

      c.取[min.max)的随机整数时使用如下公式:

      Math.floor(Math.random().(max-min)+min)

      d.取(min,max]的随机整数时使用如下公式:

      Math.floor(Math.random().(max-min)+min+1)

      上面的是由(min,max]即[min+1,max]代入b的公式算出来就可以。

      e.不要使用ceil,因为无法控制Math.random()什么时候为0,同理如下:

      Math.ceil(Math.random().(max-min+1)+min)

      好像是取(min,max]之间的值,但是不清楚什么时候就会取到min。使用random的取随机整数的时候使用向下取整。

  • 相关阅读:
    Mysql(连接查询)
    Mysql(条件查询)
    mysql:dql(基本数据查询)
    mysql:ddl(创建表、创建数据库、删除表、修改表)
    多线程(线程间的数据共享、线程安全、线程通信)
    多线程(进程与线程、多线程的实现方式、线程池、多线程的优点)
    IO流(IO流的工具类、Properties类)
    IO流(转换流、打印流、序列化流与反序列化流)
    IO流(输入输出流(字节、字节缓冲、文件字符、文件字符缓冲)、IO流的应用、缓冲数组)
    IO流(File类:构造方法、常用方法、递归获取文件、文件过滤)
  • 原文地址:https://www.cnblogs.com/liziyu91/p/8444789.html
Copyright © 2011-2022 走看看