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

 壹 git

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

對了,若是你要取範圍整數的方法,請跳到文章尾部,但若是你想知道爲何這麼寫,請閱讀本文,那麼原本開始:面試

題目來源數組

 貳  關於random()dom

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

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

那麼咱們能夠經過Math.random()先取得隨機數,再經過乘法計算獲得大體範圍,最後經過Math.floor()進行取整加工就能夠達到目的了。blog

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

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

//[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,23] 呢,簡單分析一波,random是0時,咱們但願獲得2;假設random能夠是1,咱們但願得算出一個24才行,這樣向下取整就能包含23了。

根據上面的分析,因此咱們得讓random乘法獲得一個22,而後再加一個2,應該這麼寫:

Math.floor(Math.random() * 22) + 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方法?

相關文章
相關標籤/搜索