利用線性同余產生偽隨機數+可變參數使用


一、利用線性同余產生偽隨機數:

1)程序設計原理:

線性同余方法LCG)是個產生偽隨機數的方法。

它是根據遞歸公式:

 

其中 是產生器設定的常數。

LCG的周期最大為 =pow(2,31)-1,但大部分情況都會少於M。要令LCG達到最大周期,應符合以下條件:

一般選取方法:乘數A滿足A=4p+1;增量B滿足B=2q+1。其中p,q為正整數。

M值得話最好是選擇大的,因為M值直接影響偽隨機數序列的周期長短。A和B的值越大,產生的偽隨機數越均勻

A和M如果互質,產生隨機數效果比不互質好。

 

2)源代碼

package homework2;

 

public class Random {

        

         public static void main(String[] args) {

                   // TODO Auto-generated method stub

                   final int N=1001;

                   double []ran=new double[N];

        double a=Math.pow(7, 5),c=0;

        double m=Math.pow(2,31)-1;

                   ran[0]=1;

                   System.out.println("產生的隨機數為:");

                   for(int i=1;i<=1000;++i){

                            ran[i]=(ran[i-1]*a+c)%m;

                            System.out.print((int)ran[i]+" ");

                            if(i%10==0) {

                                     System.out.println("");

                            }

                            if(i%100==0) {

                                     System.out.println("");

                            }

                           

                   }

 

         }

 

}

3)結果截圖:

 

 

4)附帶數學知識:

①原根定義:

設m是正整數,a是整數,若a模m的階等於φ(m),則稱a為模m的一個原根。(其中φ(m)表示m的歐拉函數)。

假設一個數g對於P來說是原根,那么g^i mod P的結果兩兩不同,且有 1<g<P, 0<i<P,那么g可以稱為是P的一個原根,歸根到底就是g^(P-1) = 1 (mod P)當且僅當指數為P-1的時候成立。(這里P是素數)。

求原根目前的做法只能是從2開始枚舉,然后暴力判斷g^(P-1) = 1 (mod P)是否當且當指數為P-1的時候成立,而由於原根一般都不大,所以可以暴力得到。

②歐拉函數性質:

通式:

 

 

其中p1, p2……pn為x的所有質因數,x是不為0的整數。

φ(1)=1(唯一和1互質的數(小於等於1)就是1本身)。

注意:每種質因數只一個。 比如12=2*2*3那么φ(12)=12*(1-1/2)*(1-1/3)=4

若n是質數p的k次冪,

因為除了p的倍數外,其他數都跟n互質。

設n為正整數,以 φ(n)表示不超過n且與n互素的正整數的個數,稱為n的歐拉函數值。

φ:N→N,n→φ(n)稱為歐拉函數。

歐拉函數是積性函數——若m,n互質,

特殊性質:

當n為奇數時,,證明與上述類似。

若n為質數,則

 

二、可變參數使用:

1)程序設計原理:

通過設置不同參數類型的同名函數,方便用戶的輸入,比如此題設置int和double的 square()函數,就不用在輸入時選擇參數類型。完善程序。

(2)源代碼:

package homework2;

 

public class handAndHead {

 

    public static void main(String[] args) {

        // TODO Auto-generated method stub

 

        System.out.println("The square of integer 7 is "+square(7));

        System.out.println("\nThe square of integer 7 is "+square(7.5));

    }

    public static int square(int x) {

        return x*x;

    }

    public static double square(double y) {

        return y*y;

    }

   

 

}

 

3)程序結果截圖:

 

4)總結:

通過定義同名函數的不同參數類型,方便調用,提高程序運行效率。

三、查看一下JDKSystem.out.println()方法

(1)截圖:

 

 

(2)發現:

類似題二的可變參數,可以定義多個不同參數類型的同名函數,這樣方便用戶進行輸入,提高程序的友好性。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM