*本章節會教怎麼推算random:0~n、m~n,數學邏輯苦手和程式新手可以把握呦*
Java的Math函式庫裡有個random(),是取蒙地卡羅亂數從0~1之間,包含小數
呼教語法:Math.random()
在此我們運用(int)強制將random取出的數字轉型成integer整數型態
運用java overload依不同參數數入來分別同名稱但不同功能的函式
/*文章最底下有Random轉換介紹*/
製作出兩個函式:
1. 輸入n、輸出0~n的整數亂數
2. 輸入n, m、輸出n~m的整數亂數
public class c001c {
public static int Rand(int n)
{return((int)(Math.random()*n));}
public static int Rand(int n,int m)/*Overload*/
{return(n+Rand(m-n+1));}
public static void main(String[] a)
{
int x;
for(int i=0;i<10;i++)
{
x = Rand(2,4);
System.out.println(x);
}
}
}
簡單補充Random的計算:
設random()用r表示
step1. 0<=r<1 //r是0~1之間任意數(包含小數,不包含1)
step2. 0<=r*10<10 //r*10 是0~10之間任意數(不包含10)
step3. (int) 0<=r*10<=9 //強制轉型整數後,r*10等同0~9的整數任意數
step3.5. (int) 0<=r*n<n //同乘n
step4. (int) 0<=r*n<=n-1 //依此類推求得一般化n的情形,此為第一個函式所需
step5. 思考:0+m <= r*n +m <= n-1+m //思考全部同加m,即可得到m~(m+n-1)
step6. 思考:如果想求得m~n: m<=r*???<=n 勢必得讓最右邊的部分加上m時可以相消,最後只剩下n,所以不能先同加m
step6.5. (int) 0<=r*(-m+n+1)<(-m+n+1) //同乘 (-m+n+1)
step7. (int) 0<=r*(-m+n+1) <= (-m+n) //思考到最右邊是n,所以要+n;思考下一步要同加m消m,所以-m;思考到最右邊會-1,所以+1
step8. (int) m<=r*(n-m+1)+m <= n //同加n即得到第二函式所需,只是我上面的函式n, m位置剛好顛倒了,互換即可,道裡相同
回看兩年前自己寫的亂數建構式解法(Java第四回番外篇:給初學者解析隨機整數(整數的亂數)的推導)
建議大家直接看這篇就好,那篇字太多了,思考模式也很慢
真是一頭霧水,明明只是缺什麼就補什麼的運算邏輯,當時怎麼能想得那麼複雜??
也許是經過演算法的洗禮後,默默地腦袋開竅了吧?