# [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