js random獲取隨機數,獲取任意范圍內隨機整數


 壹 

想着好久沒做筆試題了,去GitHub找了面試相關的項目,結果被第一道題難住了.....說難其實也不難,而是我忘記了取范圍隨機整數怎么寫了,不可否認如果當時是我在筆試,肯定也涼了,那么就由這道題引出本文。

對了,如果你要取范圍整數的方法,請跳到文章尾部,但如果你想知道為什么這么寫,請閱讀本文,那么本文開始:

題目來源

 貳  關於random()

若要取隨機整數,前提得知道數組API中的Math.random()方法能取0--1的隨機數,它的范圍是[0,1)也就是取包括0但不包括1的隨機數。

其次,數組API中有一個Math.floor()方法代表向下取整,Math.floor(X)的代表的是取≤ X 且最接近X的整數。

那么我們可以通過Math.random()先取得隨機數,再通過乘法計算得到大致范圍,最后通過Math.floor()進行取整加工就可以達到目的了。

1.取[n,m)范圍隨機整數

比如,我要取 [0,100) 范圍的隨機整數,包括0但不包括100:

//[0,1)*100 => [0,100) 范圍是0-99.99999...隨機數
Math.random() * 100;
//向下取整加工,范圍變成 0-99
Math.floor(Math.random() * 100);

0-100好理解一點,那我們怎么取 [2,32) 之間隨機整數呢,思路相同:

當random取到0時,我們希望最后結果是2,所以需要有個加2的操作,那么32的情況只能拆分成30 + 2,所以應該是先乘法得到30,再有個加2的操作,像這么寫:

Math.floor(Math.random() * 30) + 2;

結合上面2個例子,我們大概可以得出一個規律,取 [n,m) 包括n但不包括m的隨機整數公式

Math.floor(Math.random() * (m-n)) + n;

2.取[n,m]范圍隨機整數

如何取得包含n且包含m的隨機整數呢,我們還是以好計算的[0,100]為例子。

按照前面的寫法無法取到100,怎么辦呢,我們直接在計算時得到一個100.99999,然后向下取整不就是100了,所以我們需要在乘以100的基礎上再加上一個1。

需要注意的是加1操作的不能在random乘法計算完之后,你想想如果是乘完后加1,假設random乘法得到0再加個1,那最少的數字就是1了,所以加1必須是在乘法的時候加,所以應該是這樣:

Math.floor(Math.random() * 101);

這樣根據 [0,1) 的范圍算出來的范圍就是 [0,101),因為不包括101,所以就是[0,100]了。

 針對 [2,32] 呢,簡單分析一波,random是0時,我們希望得到2;假設random可以是1,我們希望得算出一個33才行,這樣向下取整就能包含32了。

根據上面的分析,所以我們得讓random乘法得到一個31,然后再加一個2,應該這么寫:

Math.floor(Math.random() * 31) + 2;

我們大概可以得到一個規律,求 [n,m] 范圍內的隨機整數時,應該這樣:

Math.floor(Math.random() * (m - n + 1)) + n;

那么取范圍隨機整數問題解決了,我們來解決那道筆試題:

let arr = new Array(5);
function randomArr(i = 0, min = 2, max = 32) {
    let num = Math.floor(Math.random() * (max - min + 1)) + min;
    if (!arr.includes(num)) {arr[i] = num;i++;};
    return i < 5 ? randomArr(i) : arr;
};
let result = randomArr();

沒超過十五行,雖然 if 這里沒換行,看着不太美觀,試了下,完全沒問題,那么我們成功解決了這個問題。

 叄  玩點花樣

既然知道了如何取范圍內隨機數,查了下,顏色強度范圍是 [0-255] ,那么我們來做個隨機變色的背景圖。

function random(min = 0, max = 255) {
    return Math.floor(Math.random() * (max - min + 1)) + min;
};

function randomColor() {
    let r = random(),
        g = random(),
        b = random();
    return `rgb(${r},${g},${b})`;
};
let color = randomColor();

然后,我們做出這么個東西:

 肆 

 那么寫到這,我們掌握了這些知識:

1.Math.random()可用來獲取 [0,1) 范圍的隨機數,包括0但不包括1。

2.Math.floor()可對數字進行向下取整,取整規則是小於等於且最接近該數字的整數。

3.取 [n,m) 范圍的隨機整數通用公式

Math.floor(Math.random() * (m-n)) + n;

4.取 [n,m] 范圍的隨機整數通用公式

Math.floor(Math.random() * (m - n + 1)) + n;

5.如何利用取范圍隨機整數來獲取隨機顏色。

那么本文先結束,留個問題,為什么取整數不能使用round方法,或者ceil方法呢,為什么要使用floor方法?

若有興趣,請閱讀博主 為何隨機取整要用floor,而非ceil或round呢


免責聲明!

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



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