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的取隨機整數的時候使用向下取整。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM