JS生成限定整數區間范圍內的隨機整數


對於整數區間獲取隨機整數:

m,n均為整數,且n>m。

獲取[m,n)區間內的隨機整數:

1 var aNumber = (n - m) * Math.random() + m;
2 var result = Math.floor(aNumber);

獲取獲取[m,n]區間內的隨機整數:

1 var aNumber = (n+1- m) * Math.random() + m;
2 var result = Math.floor(aNumber);

獲取對於區間(m,n)的隨機整數,JS代碼:

1 var aNumber = (n-1- m) * Math.random() + (m+1);
2 var result = Math.floor(aNumber);

獲取獲取(m,n]區間內的隨機整數:

1 var aNumber = (n- m) * Math.random() + (m+1);
2 var result = Math.floor(aNumber);

推導過程:

Math.random()的值為數學上的半開半閉區間[0,1),即0≤Math.random()<1。在JS中生成限定范圍內的隨機整數其實也是基於Math.random()來操作實現的隨機整數。

1、通過Math.random()獲取[0,10)之間的隨機整數。

1 var aNumber = 10 * Math.random();
2 var result = Math.floor(aNumber);

aNumber的值在[0,1)區間取值為0,依次類推到[9,10)區間取值為9,每個區間長度值一樣,所代表的數同樣多,aNumber在每個區間內的概率相同。

先看幾個類似的隨機整數的試題:

1、JS隨機生成[20,50)區間內的隨機整數;

2、JS隨機生成[20,50]區間內的隨機整數;

3、JS隨機生成(20,50)區間內的隨機整數;

4、JS隨機生成(20,50]區間內的隨機整數。

先轉換為數學問題(需要基礎的初中數學代數知識)

為書寫方便,我們令α=Math.random(),0≤α<1,K代表生成區間內的隨機整數。

1、JS隨機生成[20,50)區間內的隨機整數。

20≤K<50

化簡:

0≤K-20<30

0≤(K-20)/30<1

即(K-20)/30=α

K=30α+20

由於α是[0,1)的隨機數,30α+20還不滿足要求,需要整數,對K進行向下取整操作:Math.floor(K)

轉換為JS代碼:

1 var aNumber=(50-20)*Math.random()+20 ;
3 var result= Math.floor(aNumber);

推廣到一般情況下,對於正整數區間[m,n)的隨機整數,JS代碼:

var aNumber = (n - m) * Math.random() + m;
var result = Math.floor(aNumber);

2、JS隨機生成[20,50]區間內的隨機整數;

與“JS采用隨機生成[20,50)區間內的隨機整數”相比,就是一個需要取末尾閉區間,隨機整數要可以取50。

等效於JS采用Math.floor()隨機生成[20,50+1]區間內的隨機整數;

推廣到一般情況下,對於區間[m,n]的隨機整數,JS代碼:

1 var aNumber = (n+1 - m) * Math.random() + m;
2 var result = Math.floor(aNumber);

思考:采取下列方式似乎同樣可以獲得[20,50]的隨機整數,這么做會有什么問題?

1 var aNumber = (50 - 20) * Math.random() + 20;
2 var result = Math.round(aNumber);

即對[20,50)區間內的隨機數進行四舍五入的操作,同樣可以實現K的取值范圍為[20,50],這樣做會產生什么問題?

3、JS采用Math.floor()隨機生成(20,50)區間內的隨機整數;

等效於JS采用Math.floor()隨機生成[21,50)區間內的隨機整數;

推廣到一般情況下,對於區間(m,n)的隨機整數,JS代碼:

1 var aNumber = (n-1 - m) * Math.random() + (m+1);
2 var result = Math.floor(aNumber);

4、JS采用Math.floor()隨機生成(20,50]區間內的隨機整數。

等效於JS采用Math.floor()隨機生成[21,51)區間內的隨機整數;

推廣到一般情況下,對於區間(m,n]的隨機整數,JS代碼:

1 var aNumber = (n - m) * Math.random() + m+1;
2 var result = Math.floor(aNumber);

思考:采用Math.ceil()與Math.random()實現上述隨機整數可能產生什么問題? 如果不明白可以到下方留言哦。

 


免責聲明!

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



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