今天要介紹的咒語(函式)Math.random()
是非常有個性的!你永遠無法預測他會變出什麼花招,但生活有時候就是需要一點小驚喜對吧?
「寐偲,阮等!!!」
英文random
也就是隨機的意思,所以Math.random()
也是帶有亂數意味的函式!
Math.random()
不需要參數。
他會回傳介於0
(含)~1
(不含)之間的偽隨機數字。
「這個函式會回傳一個正數,大於等於+0
但小於1
,且使用隨機或偽隨機方式選取,選取結果應該接近均勻分布。實作方法也是取決於引擎本身。」
「在不同領域,Math.random()
應該要能透過連續呼叫產生不同的值。」
雖然我們感受上好像是隨機,但實際上其實不算是真正的隨機,因為JS通常會透過固定的演算法來產出這個隨機數,雖然不是真正的隨機,但實際應用上已經足夠接近隨機狀態了!
隨機生成的結果應該呈現均勻分布,也就表示在0
(含)~1
(不含)這個範圍內所有數字都應該有相等的機率被選到,以確保結果不會偏向某個方向。
那我們該如何實作呢?一起來試試看吧!
我們知道Math.random()
會隨機回傳0
~1
之間的小數之後,那要如何運用呢?
其中一種是將它乘以「某數」然後只取整數部分,我們就能得到0
(含)到「某數」(不包含)之間的亂數。
function getRandomBetweenZeroAnd(n) {
return Math.trunc(Math.random() * n);
}
console.log(getRandomBetweenZeroAnd(5));
console.log(getRandomBetweenZeroAnd(5));
console.log(getRandomBetweenZeroAnd(5));
console.log(getRandomBetweenZeroAnd(5));
console.log(getRandomBetweenZeroAnd(5));
那為什麼乘上5
就能得到0
~5
之間的亂數呢?
有一個比較好理解的方式就是將數字放到數線上:
原本Math.random()
的結果會落在0
~1
之間,我們將可能得到的所有數全部乘以5
,最小是0 * 5
,最大是1 * 5
,本來範圍只有0
~1
長的長度,變成五倍0
~5
這麼長!
用這個概念理解以後,那我們要取指定區間的亂數怎麼做呢?就是乘上這個區間的長度然後全部都加上指定區間的最小數讓範圍往右移動,很難懂嗎?例如:我想取5
(含)~10
(不含)之間的亂數,先將長度算出來10 - 5 = 5
,用0
~1
這區間乘上5
,然後全部加上指定區間的最小數5
,這樣範圍就會變成5
~10
了!
function getRandomBetween(a, b) {
return Math.trunc(Math.random() * (b - a) + a);
}
console.log(getRandomBetween(5, 10));
console.log(getRandomBetween(5, 10));
console.log(getRandomBetween(5, 10));
console.log(getRandomBetween(5, 10));
console.log(getRandomBetween(5, 10));
關於Math.random()
大家也自己探索看看吧!
「寐偲,阮等!!!」
明天見~
參考資料:
MDN-Math.random()
ECMAScript-Math.random()