一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - 不使用Math.random方法生成隨機數(隨機數生成器)

不使用Math.random方法生成隨機數(隨機數生成器)

2019-10-30 17:03java教程網 JAVA教程

不調用Math.random方法產生自己的隨機數,現代計算機運行速度很快,在主線程等待一定毫秒數時,其他線程就會執行run方法中的while循環,一般會執行數十萬次

由于一些不可控因素的影響,比如系統內存,計算機狀態等,每一次在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);
 }
}

 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲国产精品一区二区三区久久 | 久久综合狠狠综合狠狠 | 果冻传媒九一制片厂 | 免费观看欧美成人禁片 | 色狠狠成人综合网 | 国产精品www夜色影视 | 国产资源免费 | 18未年禁止免费观看 | 久久久精品成人免费看 | 日本又黄又裸一级大黄裸片 | 亚洲天堂影院 | 精品国产免费一区二区三区 | 国产香蕉国产精品偷在线观看 | 国产精品51麻豆cm传媒 | 欧美人与禽杂交大片 | 精品AV亚洲乱码一区二区 | 高清一级片 | 女主被当众调教虐np | 男人爱看的网站 | 久久99精品国产自在自线 | 人与动人物性行为zozo共患病 | 国产精品俺来也在线观看了 | 99视频一区 | 女人把私密部位张开让男人桶 | 精品精品国产自在久久高清 | 俺去啦最新官网 | 国产成人精品高清在线 | jizzjizz成熟丰满舒服 | 久久久91精品国产一区二区 | 国产精品久久久久久 | 亚洲国产成人久久77 | 成年人免费观看视频网站 | 高清色黄毛片一级毛片 | 久久日本片精品AAAAA国产 | 国产精自产拍久久久久久 | 欧亚尺码专线欧洲s码wmy | 白丝校花被扒开双腿喷水小说 | 暗卫调教女主肉高h | 大象传媒2021秘密入口 | 精品国产成人a区在线观看 精品国产91久久久久久久 | 奇米影视888四色首页 |