對於整數區間獲取隨機整數:
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()實現上述隨機整數可能產生什么問題? 如果不明白可以到下方留言哦。