*本章節會教怎麼推算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第四回番外篇:給初學者解析隨機整數(整數的亂數)的推導)

建議大家直接看這篇就好,那篇字太多了,思考模式也很慢

真是一頭霧水,明明只是缺什麼就補什麼的運算邏輯,當時怎麼能想得那麼複雜??

也許是經過演算法的洗禮後,默默地腦袋開竅了吧?

arrow
arrow
    創作者介紹
    創作者 Kuihao 的頭像
    Kuihao

    溫暖午後的金針田__孕育有趣的創新

    Kuihao 發表在 痞客邦 留言(0) 人氣()