iT邦幫忙

2024 iThome 鐵人賽

DAY 20
1
Modern Web

如何詠唱JavaScript的Math咒語系列 第 20

[Day20]-跟妳心思一樣,猜不透的Math.random()

  • 分享至 

  • xImage
  •  

今天要介紹的咒語(函式)Math.random()是非常有個性的!你永遠無法預測他會變出什麼花招,但生活有時候就是需要一點小驚喜對吧?

「寐偲,阮等!!!」

Math.random

英文random也就是隨機的意思,所以Math.random()也是帶有亂數意味的函式!

語法

Math.random()

參數

不需要參數。

回傳值

他會回傳介於0(含)~1(不含)之間的偽隨機數字。

規範

image
「這個函式會回傳一個正數,大於等於+0但小於1,且使用隨機或偽隨機方式選取,選取結果應該接近均勻分布。實作方法也是取決於引擎本身。」

「在不同領域,Math.random()應該要能透過連續呼叫產生不同的值。」

偽隨機?

雖然我們感受上好像是隨機,但實際上其實不算是真正的隨機,因為JS通常會透過固定的演算法來產出這個隨機數,雖然不是真正的隨機,但實際應用上已經足夠接近隨機狀態了!

均勻分布?

隨機生成的結果應該呈現均勻分布,也就表示在0(含)~1(不含)這個範圍內所有數字都應該有相等的機率被選到,以確保結果不會偏向某個方向。

那我們該如何實作呢?一起來試試看吧!

應用

我們知道Math.random()會隨機回傳01之間的小數之後,那要如何運用呢?

其中一種是將它乘以「某數」然後只取整數部分,我們就能得到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就能得到05之間的亂數呢?

有一個比較好理解的方式就是將數字放到數線上:
image
原本Math.random()的結果會落在01之間,我們將可能得到的所有數全部乘以5,最小是0 * 5,最大是1 * 5,本來範圍只有01長的長度,變成五倍05這麼長!

用這個概念理解以後,那我們要取指定區間的亂數怎麼做呢?就是乘上這個區間的長度然後全部都加上指定區間的最小數讓範圍往右移動,很難懂嗎?例如:我想取5(含)~10(不含)之間的亂數,先將長度算出來10 - 5 = 5,用01這區間乘上5,然後全部加上指定區間的最小數5,這樣範圍就會變成510了!

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()


上一篇
[Day19]-輪到你的回合。Math.round()
下一篇
[Day21]-傳說中的,阿姆斯特朗炫風噴射阿姆斯特朗,砲。Math.pow()
系列文
如何詠唱JavaScript的Math咒語30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 則留言

0
Chris
iT邦新手 4 級 ‧ 2024-10-17 15:22:43

亂數模擬函數,參考實作
https://linux.die.net/man/3/rand

0

我要留言

立即登入留言