分析 - 獲取兩數之間隨機數 Getting a random number between two values

以下來講解面對不同需求時,如何獲取某數到某數之間的任一數字
首先先來介紹會用到的方法 :

使用 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);
}

//未完成,待修改
以上~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值