壹 ❀ 引
想着好久沒做筆試題了,去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呢