以下來講解面對不同需求時,如何獲取某數到某數之間的任一數字
首先先來介紹會用到的方法 :
使用 Math.random()會隨機產生出0~1之間的小數。包含0,但不包含1
0 ~ 0.99999
假設乘上某數時則範圍為 :
0 ~ 1.99999xx // *2
0 ~ 2.99999xx // *3
0 ~ 3.99999xx // *4
0 ~ 4.99999xx // *5
顯然整數才是我們需要的結果,這時候會使用到Math.floor
,它會返回小於等於所給數字的最大整數
Math.floor(3.14) // 3
Math.floor(5.4) // 5
Math.floor(-5.4) // -6
Math.floor("-5.5") // -6
此時math.floor套用在Math.random()*num 會返回的範圍為 :
0 ~ 1 // *2
0 ~ 2 // *3
0 ~ 3 // *4
0 ~ 4 // *5
Math.floor(Math.random())
看完了基本用法,接下來進入正題:
1. 獲取兩數之間隨機值 Getting a random number between two values
假設我們要獲取的是num bettewen 5 (inclusive) to 10 (exclusive)
首先我們將公式乘上最大數
// Random number between 0 and 10 (inclusive)
let foo = Math.floor(Math.random() * 11);
console.log(foo);
很顯然的因為radom方法是0~1但是不包含1的
因此我們乘上的數永遠需要比實際的數字多1
取到了最大範圍的數字,但是最小範圍是為 0 並不是我們要的,因此我們最後加上我們最小範圍,這樣每次結果為 0 再加上最小範圍,最小範圍永遠就是我們最後加上的。
// Random number between 0 and 10 (inclusive)
let foo = Math.floor(Math.random() * 11 +5);
console.log(foo);
那麼問題又來了,假設最後產生的值為10那麼此時再加上我們為了最小值而設定的+5,很顯然結果為15,這並不符合我們的範圍要求。因此我們可以讓產生的值和最小範圍起來的值等於最大範圍,以確保最大值永遠是在我們的設定內。因此只要將 (max- min) + min 即可,具體公式為 :
function getRandomArbitrary(min, max) {
return Math.floor(Math.random() * (max - min) + min);
}
-----------------------------------
function getRandomArbitrary(min, max) {
return Math.floor(Math.random() * (10-5) + 5);
以上例子為不包含最大值,那麼如果是想要包含最大值的話呢?很簡單因為radom是0~1不包含1的,因此像開頭介紹那樣我們的最大數永遠要比實際需要的多1 因此只要在公式裡手動加上1即可
function getRandomArbitrary(min, max) {
return Math.floor(Math.random() * (max - min+1) + min);
}
業務需求百百種,如果此時我們要的是 min(exclusive) ~max (inclusive)呢?
只是需要再以上的最後結果加上1即可,這樣如果產生的是最小值都會加上1也就出現不包含最小值了
function getRandomArbitrary(min, max) {
return Math.floor(Math.random() * (max - min) + min+1);
}
那如果min 跟max都不包含呢?
延續上面的公式我們可以得到不包含最小值但包含最大值的方法,基於這個公式,我們需要解決的只有如何不包含最大數。在上面有提到如果要包含最大值時,要在 (max -min +1),也就說在這個部分我們減去2的話就能保證不包含最大值了。
function getRandomArbitrary(min, max) {
return Math.floor(Math.random() * (max - min -2) + min + 1);
}
//未完成,待修改
以上~