動手動腦2----線性同余產生1000個隨機數


來自百科上的介紹:

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

它是根據遞歸公式:

N_{j+1} \equiv (A \times N_j + B ) \pmod{M}

其中A,B,M是產生器設定的常數。

LCG的周期最大為M,但大部分情況都會少於M。要令LCG達到最大周期,應符合以下條件:

  1. B,M互質
  2. M的所有質因子的能整除A-1
  3. M是4的倍數A-1也是;
  4. A,B,N_0都比M小;
  5. A,B是正整數。

    線性同余算法有m 、a 、c 和X0 4個參數,通過置Xn + 1 ≡aXn + c (mod m) ,求得隨機數序列< Xn > , 這個序列稱作線性同余序列。m、a 、c 和X0 分別稱做模數、乘數、增量和初始值。線性同余方法速度快,如果對乘數和模數進行適當的選擇,可以滿足用於評價一個隨機數產生器的3 種准則:
1.這個函數應該是一個完整周期的產生函數。也就是說,這個函數應該在重復之前產生出0 到m之間的所有數;
2.產生的序列應該看起來是隨機的;
3.這個函數應該用32bit 算術高效實現。

在我的實現中,X0(或者叫N0)用系統提供的時間,A選16087,B選取0,M選取2147483647,即1<<31-1

源代碼:

 1 public class Test2 {
 2       public static void random(int num) {
 3           long send = System.currentTimeMillis();
 4           for(int i = 1;i<=num;++i) {
 5               send = (send*16807+0)%((1<<31) - 1);
 6               System.out.print(send+" ");
 7               if(i % 10 == 0)System.out.println();
 8           }
 9       }
10       public static void main(String[]args) {
11           Test2.random(1000);
12       }
13 }

驗證截圖:

(直接截取了一部分)

 


免責聲明!

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



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