一、利用線性同余產生偽隨機數:
(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)總結:
通過定義同名函數的不同參數類型,方便調用,提高程序運行效率。
三、查看一下JDK中System.out.println()方法
(1)截圖:
(2)發現:
類似題二的可變參數,可以定義多個不同參數類型的同名函數,這樣方便用戶進行輸入,提高程序的友好性。