欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2014年01月11日 09:36:32   作者:  
不調(diào)用Math.random方法產(chǎn)生自己的隨機數(shù),現(xiàn)代計算機運行速度很快,在主線程等待一定毫秒數(shù)時,其他線程就會執(zhí)行run方法中的while循環(huán),一般會執(zhí)行數(shù)十萬次

由于一些不可控因素的影響,比如系統(tǒng)內(nèi)存,計算機狀態(tài)等,每一次在while循環(huán)中執(zhí)行的次數(shù)會有一定差異
大概幾百次。這就導(dǎo)致了結(jié)果的差異。
注意這個程序使用了許多靜態(tài)變量,也就是說,在下一個線程繼續(xù)執(zhí)行與上一個線程相同的run方法時,其初始值是上一個線程執(zhí)行后的值,這形成了經(jīng)典的蝴蝶效應(yīng),通過將這個差異放大,導(dǎo)致最終隨機數(shù)的產(chǎn)生。
在這個程序中,一共開啟了13個thread線程,每一次都會將那幾個靜態(tài)變量的值向混亂的方向推動,
于是最后得到的數(shù)組double[] bb的混亂程度幾何上升,
最開始的bb[0]只有約幾百個可能的值,而到了bb[3]就可以是65536個數(shù)據(jù)中的任何一個。
為了做到隨機,我循環(huán)了13次,bb[12]幾乎可以說是絕對的隨機了。

復(fù)制代碼 代碼如下:

/**
 * 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個數(shù)按照一定順序存入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));
                                //防止不動點對程序的影響,當兩個值相同說明程序有可能進入了死胡同,也就是不動點,關(guān)于不動點的問題可以參考高等數(shù)學關(guān)于函數(shù)的知識
   }
  }
  double ran=dd[12];
  return ran;
 }

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

MyRandom.java

復(fù)制代碼 代碼如下:

/**
 * 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個數(shù)按照一定順序存入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));
    // 防止不動點對程序的影響,當兩個值相同說明程序有可能進入了死胡同,也就是不動點,關(guān)于不動點的問題可以參考高等數(shù)學關(guān)于函數(shù)的知識
   }
  }
  double ran=dd[12];
  return ran;
 }

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

相關(guān)文章

  • Eclipse Web項目打成war包的方法圖解

    Eclipse Web項目打成war包的方法圖解

    當Tomcat啟動后該壓縮文件自動解壓縮,war包方便了web工程的發(fā)布,那么Eclipse中如何將Web項目打成war包呢?下面小編通過圖文并茂的方式給大家講解下Eclipse Web項目打成war包的方法,一起看看吧
    2016-08-08
  • java中如何獲取相關(guān)參數(shù)

    java中如何獲取相關(guān)參數(shù)

    這篇文章主要介紹了java獲取系統(tǒng)屬性相關(guān)參數(shù)的方法,,需要的朋友可以參考下
    2015-07-07
  • SpringBoot 之啟動流程詳解

    SpringBoot 之啟動流程詳解

    SpringBoot 是一個基于 Spring 框架的快速開發(fā)框架,旨在簡化 Spring 應(yīng)用程序的開發(fā)和部署。在本文中,我們將深入分析 SpringBoot 啟動過程的源代碼,并提供必要的解釋和說明
    2023-04-04
  • Spring中@ConditionalOnProperty注解的作用詳解

    Spring中@ConditionalOnProperty注解的作用詳解

    這篇文章主要介紹了Spring中@ConditionalOnProperty注解的作用詳解,@ConditionalOnProperty注解主要是用來判斷配置文件中的內(nèi)容來決定配置類是否生效用的,如果條件不匹配,則配置類不生效,需要的朋友可以參考下
    2024-01-01
  • SpringBoot Maven打包插件spring-boot-maven-plugin無法解析原因

    SpringBoot Maven打包插件spring-boot-maven-plugin無法解析原因

    spring-boot-maven-plugin是spring boot提供的maven打包插件,本文主要介紹了SpringBoot Maven打包插件spring-boot-maven-plugin無法解析原因,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • C語言中下標與指針的轉(zhuǎn)換以及指向指針的指針的例子

    C語言中下標與指針的轉(zhuǎn)換以及指向指針的指針的例子

    這篇文章主要介紹了C語言中下標與指針的轉(zhuǎn)換以及指向指針的指針的示例,是C語言入門學習中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-11-11
  • Java中左移和右移問題圖文詳解

    Java中左移和右移問題圖文詳解

    左移和右移并不常用,在一些特殊情況下才會使用,比如加解密時,會大量用到,這篇文章主要給大家介紹了關(guān)于Java中左移和右移問題的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • Java中try catch的使用和如何拋出異常問題

    Java中try catch的使用和如何拋出異常問題

    這篇文章主要介紹了Java中try catch的使用和如何拋出異常問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • springboot集成mybatisplus實例詳解

    springboot集成mybatisplus實例詳解

    這篇文章主要介紹了springboot集成mybatisplus實例詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-09-09
  • SpringSecurity構(gòu)建基于JWT的登錄認證實現(xiàn)

    SpringSecurity構(gòu)建基于JWT的登錄認證實現(xiàn)

    這篇文章主要介紹了SpringSecurity構(gòu)建基于JWT的登錄認證實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02

最新評論