---
# System prepended metadata

title: '[debug] 關於隨機取數異常'

---

# [debug] 關於隨機取數異常

```javascript=
		<script>
			function SN(){
				$min=$("#Nmin").val();
				$max=$("#Nmax").val();
				$num=$("#Nsel").val();
				$output=" ";
				var ran;
				var i;
				for(i=0;i<$num;i++){
					ran=Math.floor(Math.random()*($max-$min+1)+$min);
					//ran=Math.floor(Math.random()*($max-$min+1+$min));
					$output=$output+ran+" ";
				}
				window.alert($output);
			}
		</script>
```

大家看上面這段程式碼，乍看之下沒有問題

![](https://i.imgur.com/5yXohQf.png)

實際運作卻跑出了不該出現的0這個數字

其實照理講應該是不會有問題的才對

random這個function會得到
```javascript=
Math.random(); //0.8961082300942438
Math.random(); //0.009676286758744546
Math.random(); //0.7722302289555816
```
floor這個function是無條件去除小數點
```javascript=
Math.floor(Math.random());  //回傳0
Math.floor(0.99999999999);  //回傳0
```
讓random*上某個數字再去除小數點會得到的結果是
```javascript=
Math.floor(Math.random()*2); //回傳0或1
Math.floor(Math.random()*3); //回傳0或1或2
Math.floor(Math.random()*5); //回傳0或1或2或3或4
Math.floor(Math.random()*50); //回傳0或1或2或3...或49
```
所以如果你加1
```javascript=
 Math.floor(Math.random()*10)+1;
```
意思就是原本0~9變成1~10

所以現在乍看之下10代表最大值，1代表最小值

```javascript=
Math.floor(Math.random()*max)+min;
```
但如果你這樣寫的話，萬一今天是max=10 min=5
應該要獲得5到10之間
實際最大值卻變14，最小值是5
因為我們知道每次random那邊最大值都會少1，所以加回去
```javascript=
Math.floor(Math.random()*（max＋1）)+min;
```
現在如果max=10 min=5
會得到最大值15 最小值5
所以要把最小值減掉
```javascript=
Math.floor(Math.random()*（max-min＋1）)+min;
```
如果最大值max=10 min=5
random那邊就會10-5+1=6
會獲得0到5的數字，加上外面的min，就會獲得5到10之間的數字

同學code寫這樣
```javascript=
ran=Math.floor(Math.random()*($max-$min+1)+$min);
```
把min寫在了floor裡面
雖然說照理講
假設max=10 , min=1
random那邊會獲得0到9的數字，然後再加1，整體再去除小數點
最小應該都要有1
但有可能就是小數點加整數的運算發生了問題，我也不是很確定
```javascript=
alert(Math.random()*($max-$min+1)+$min);
```
所以我試試看如果沒有floor，會得到什麼
![](https://i.imgur.com/RzfrYdD.png)
結果還真的有小於1的數字
猜測有可能是資料型態的問題
```javascript=
$min=$("#Nmin").val();
$max=$("#Nmax").val();
$num=$("#Nsel").val();

alert(typeof($min));
alert(typeof($min));
alert(typeof($min));
```
這段程式碼會顯示出你取得的值是什麼類型的，因為在程式中值有可能是字串有可能是數字，這會影響他們如何運算

![](https://i.imgur.com/8PmhNG3.png)

結果真的他們都是string，就是字串的意思

```javascript=
ran=Math.floor(Math.random()*($max-$min+1))+$min;
```
現在我們把min挪到正確的位置會發生什麼事？
![](https://i.imgur.com/NqKgDgp.png)
你現在應該知道為什麼會這樣了吧？
每個數字結尾都有個1，就是因為現在他們被當字串處理

```javascript=
$min=parseInt($("#Nmin").val());
$max=parseInt($("#Nmax").val());
$num=parseInt($("#Nsel").val());
```
因此取值的時候都先轉換成int也就是integer也就是整數的意思
![](https://i.imgur.com/LjxJGcb.png)
這樣運作就正常了

打這篇打的好累，那個問我的同學我會隨機抽問你，最好要認真看這篇阿。

參考資料：
https://ithelp.ithome.com.tw/articles/10197904
https://ithelp.ithome.com.tw/articles/10197920