程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 不應用Math.random辦法生成隨機數(隨機數生成器)

不應用Math.random辦法生成隨機數(隨機數生成器)

編輯:關於JAVA

不應用Math.random辦法生成隨機數(隨機數生成器)。本站提示廣大學習愛好者:(不應用Math.random辦法生成隨機數(隨機數生成器))文章只能為提供參考,不一定能成為您想要的結果。以下是不應用Math.random辦法生成隨機數(隨機數生成器)正文


因為一些弗成控身分的影響,好比體系內存,盤算機狀況等,每次在while輪回中履行的次數會有必定差別
年夜概幾百次。這就招致了卻果的差別。
留意這個法式應用了很多靜態變量,也就是說,鄙人一個線程持續履行與上一個線程雷同的run辦法時,其初始值是上一個線程履行後的值,這構成了經典的胡蝶效應,經由過程將這個差別縮小,招致終究隨機數的發生。
在這個法式中,一共開啟了13個thread線程,每次都邑將那幾個靜態變量的值向凌亂的偏向推進,
因而最初獲得的數組double[] bb的凌亂水平幾何上升,
最開端的bb[0]只要約幾百個能夠的值,而到了bb[3]便可所以65536個數據中的任何一個。
為了做到隨機,我輪回了13次,bb[12]簡直可以說是相對的隨機了。


/**
 * Author:Yuanhonglong
 * Date:2014-1-9
 */

public class MyRandom implements Runnable{

 private static int random;
 private static int f=127;
 private static int m=(int)Math.pow(2,16);
 private static int[] r=getR();
 private static int x=13;

 @Override
 public void run(){
  for(;!Thread.interrupted();){
   f=((f/2)+r[f])%m;
   random=r[f];
  }
 }

 private static int[] getR(){
                //將0-65536這65536個數依照必定次序存入r[]中
  int[] r=new int[m];
  r[0]=13849;
  for(int i=1;i<m;i++){
   r[i]=((2053*r[i-1])+13849)%m;
  }
  int k=r[65535];
  r[65535]=r[(f+1)%m];
  r[(f+1)%m]=k;
  return r;
 }

 private static void changeR(int[] r,int f){
                //對r[]停止挪動
  int[] r1=new int[r.length];
  System.arraycopy(r,0,r1,0,r.length);
  for(int i=0;i<r.length;i++){
   r[i]=r1[(i+f)%m];
  }
 }

 public static double getRandom_0_1(){
  double[] dd=new double[13];
  for(int i=0;i<dd.length;i++){
   Runnable runnable=new MyRandom();
   Thread thread=new Thread(runnable);
   thread.start();
   try{
    Thread.sleep(x+1);
   }
   catch(InterruptedException e){
    e.getMessage();
   }
   thread.interrupt();
   double rr=(double)random/(double)m;
   x=f%13;
   changeR(r,11+(f/7));
   dd[i]=rr;
   if((i>0)&&(dd[i]==dd[i-1])){
    changeR(r,13+(f/11));
                                //避免不動點對法式的影響,當兩個值雷同解釋法式有能夠進入了逝世胡同,也就是不動點,關於不動點的成績可以參考高級數學關於函數的常識
   }
  }
  double ran=dd[12];
  return ran;
 }

 public static void main(String[] args){
  double rs=getRandom_0_1();
  System.out.println(rs);
 }
}

MyRandom.java


/**
 * Author:Yuanhonglong
 * Date:2014-1-9
 */
package mine.loop;

public class MyRandom implements Runnable{

 private static int random;
 private static int f=127;
 private static int m=(int)Math.pow(2,16);
 private static int[] r=getR();
 private static int x=13;

 @Override
 public void run(){
  for(;!Thread.interrupted();){
   f=((f/2)+r[f])%m;
   random=r[f];
  }
 }

 private static int[] getR(){
  // 將0-65536這65536個數依照必定次序存入r[]中
  int[] r=new int[m];
  r[0]=13849;
  for(int i=1;i<m;i++){
   r[i]=((2053*r[i-1])+13849)%m;
  }
  int k=r[65535];
  r[65535]=r[(f+1)%m];
  r[(f+1)%m]=k;
  return r;
 }

 private static void changeR(int[] r,int f){
  int[] r1=new int[r.length];
  System.arraycopy(r,0,r1,0,r.length);
  for(int i=0;i<r.length;i++){
   r[i]=r1[(i+f)%m];
  }
 }

 public static double getRandom_0_1(){
  double[] dd=new double[13];
  for(int i=0;i<dd.length;i++){
   Runnable runnable=new MyRandom();
   Thread thread=new Thread(runnable);
   thread.start();
   try{
    Thread.sleep(x+1);
   }
   catch(InterruptedException e){
    e.getMessage();
   }
   thread.interrupt();
   double rr=(double)random/(double)m;
   x=f%13;
   changeR(r,11+(f/7));
   dd[i]=rr;
   if((i>0)&&(dd[i]==dd[i-1])){
    changeR(r,13+(f/11));
    // 避免不動點對法式的影響,當兩個值雷同解釋法式有能夠進入了逝世胡同,也就是不動點,關於不動點的成績可以參考高級數學關於函數的常識
   }
  }
  double ran=dd[12];
  return ran;
 }

 public static void main(String[] args){
  double rs=getRandom_0_1();
  System.out.println(rs);
 }
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved