手机
当前位置:查字典教程网 >编程开发 >Java >不使用Math.random方法生成随机数(随机数生成器)
不使用Math.random方法生成随机数(随机数生成器)
摘要:由于一些不可控因素的影响,比如系统内存,计算机状态等,每一次在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);

}

}

【不使用Math.random方法生成随机数(随机数生成器)】相关文章:

java Collection 之List学习介绍

java使用回溯法求解数独示例

在java中使用dom4j解析xml(示例代码)

Java如何实现HTTP断点续传功能

使用Java获取html中Select,radio多选的值方法

浅析JAVA中toString方法的作用

可视化Swing中JTable控件绑定SQL数据源的两种方法深入解析

关于JAVA中this的使用方法小结

java中使用sax解析xml的解决方法

java中File类的使用方法

精品推荐
分类导航