不使用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);
 }
}

(0)

相关推荐

  • Python标准库之随机数 (math包、random包)介绍

    我们已经在Python运算中看到Python最基本的数学运算功能.此外,math包补充了更多的函数.当然,如果想要更加高级的数学功能,可以考虑选择标准库之外的numpy和scipy项目,它们不但支持数组和矩阵运算,还有丰富的数学和物理方程可供使用. 此外,random包可以用来生成随机数.随机数不仅可以用于数学用途,还经常被嵌入到算法中,用以提高算法效率,并提高程序的安全性. math包 math包主要处理数学相关的运算.math包定义了两个常数: 复制代码 代码如下: math.e   # 自

  • 使用js Math.random()函数生成n到m间的随机数字

    摘要: 本文讲解如何使用js生成n到m间的随机数字,主要目的是为后期的js生成验证码做准备. Math.random()函数返回0和1之间的伪随机数,可能为0,但总是小于1,[0,1) 生成n-m,包含n但不包含m的整数: 第一步算出 m-n的值,假设等于w 第二步Math.random()*w 第三步Math.random()*w+n 第四步parseInt(Math.random()*w+n, 10) 生成n-m,不包含n但包含m的整数:​ 第一步算出 m-n的值,假设等于w 第二步Math

  • 在javascript中随机数 math random如何生成指定范围数值的随机数

    今天有朋友向我请教:JavaScript 怎么生成指定范围数值随机数.Math.random() 这个方法相信大家都知道,是用来生成随机数的.不过一般的参考手册时却没有说明如何用这个方法来生成指定范围内的随机数.这次我就来详细的介绍一下Math.random(),以及如何用它来生成制定范围内的随机数. w3school的random()教程 定义和用法 random() 方法可返回介于 0 ~ 1 之间的一个随机数. 语法 Math.random() 返回值 0.0 ~ 1.0 之间的一个伪随机

  • JavaScript中用于生成随机数的Math.random()方法

    此方法返回0(含)和1(不包括)之间的随机数 语法 Math.random() ; 下面是参数的详细信息: NA 返回值: 返回0(含)和1(不包括)之间的随机数 例子: <html> <head> <title>JavaScript Math random() Method</title> </head> <body> <script type="text/javascript"> var value

  • javascript Math.random()随机数函数

    random函数语法 Math.random(); random函数参数 无参数 random函数返回值 返回0和1之间的伪随机数,可能为0,但总是小于1,[0,1) random函数示例 document.write(Math.random()); 返回随机数 document.write(Math.random()*(20-10)+10); 返回10-20的随机数 document.write(Math.random()*(n-m)+m); 返回指定范围的随机数(m-n之间)的公式

  • 不使用Math.random方法生成随机数(随机数生成器)

    由于一些不可控因素的影响,比如系统内存,计算机状态等,每一次在while循环中执行的次数会有一定差异大概几百次.这就导致了结果的差异.注意这个程序使用了许多静态变量,也就是说,在下一个线程继续执行与上一个线程相同的run方法时,其初始值是上一个线程执行后的值,这形成了经典的蝴蝶效应,通过将这个差异放大,导致最终随机数的产生.在这个程序中,一共开启了13个thread线程,每一次都会将那几个静态变量的值向混乱的方向推动,于是最后得到的数组double[] bb的混乱程度几何上升,最开始的bb[0]

  • 实例讲解Java中random.nextInt()与Math.random()的基础用法

    1.来源 random.nextInt() 为 java.util.Random类中的方法: Math.random() 为 java.lang.Math 类中的静态方法. 2.用法 产生0-n的伪随机数(伪随机数参看最后注解): // 两种生成对象方式:带种子和不带种子(两种方式的区别见注解) Random random = new Random(); Integer res = random.nextInt(n); Integer res = (int)(Math.random() * n)

  • JavaScript中随机数方法 Math.random()

    目录 定义 基础写法 生成指定范围内的随机数 生成两个数之间的随机数 常用场景 前言: 我们学习项目的时难免遇到一些问题,比如;遇到一个功能需要随机返回多条不重复的数据,也可以是拿了就用,下次再需要时已经忘记如何使用了:虽然接触使用的场景很少,但也有必要单独拿出来讲一讲 定义 js中的生成随机数操作是基于 Math 方法下的 random() 方法 Math.random() : 随机获取范围内的一个数 ( 精确到小数点后14位 ) 基础写法 随机生成一个 0 ~ 1 之间的数:  // 语法:

  • 使用Math.floor与Math.random取随机整数的方法详解

    Math.random():获取0~1随机数 Math.floor() method rounds a number DOWNWARDS to the nearest integer, and returns the result. (小于等于 x,且与 x 最接近的整数.)其实返回值就是该数的整数位:Math.floor(0.666)   -->  0Math.floor(39.2783)   -->  39 所以我们可以使用Math.floor(Math.random())去获取你想要的一

  • javascript中Math.random()使用详解

    Math.random()方法返回大于等于 0 小于 1 的一个随机数.对于某些站点来说,这个方法非常实用,因为可以利用它来随机显示一些名人名言和新闻事件. 1. 在连续整数中取得一个随机数 值 = Math.floor(Math.random() * 可能值的总数 + 第一个可能的值) 例:产生1-10的随机数 复制代码 代码如下: var rand1 = Math.floor(Math.random() * 10 + 1); 编写产生startNumber至endNumber随机数的函数 复

  • Python内置random模块生成随机数的方法

    本文我们详细地介绍下两个模块关于生成随机序列的其他使用方法. 随机数参与的应用场景大家一定不会陌生,比如密码加盐时会在原密码上关联一串随机数,蒙特卡洛算法会通过随机数采样等等.Python内置的random模块提供了生成随机数的方法,使用这些方法时需要导入random模块. import random 下面介绍下Python内置的random模块的几种生成随机数的方法. 1.random.random()随机生成 0 到 1 之间的浮点数[0.0, 1.0).注意的是返回的随机数可能会是 0 但

  • Python中random模块生成随机数详解

    Python中的random模块用于生成随机数.下面介绍一下random模块中最常用的几个函数. random.random random.random()用于生成一个0到1的随机符点数: 0 <= n < 1.0 random.uniform random.uniform的函数原型为:random.uniform(a, b),用于生成一个指定范围内的随机符点数,两个参数其中一个是上限,一个是下限.如果a > b,则生成的随机数n: a <= n <= b.如果 a <

  • Python使用random模块生成随机数操作实例详解

    本文实例讲述了Python使用random模块生成随机数操作.分享给大家供大家参考,具体如下: 今天在用Python编写一个小程序时,要用到随机数,于是就在网上查了一下关于Python生成各种随机数的方法,现将其总结如下: 此处,利用Python中的random模块生成随机数.因此首先必须导入该模块:import random 一. 随机产生一个元素 import random #生成一个0到1的随机浮点数: 0 <= n < 1.0 print(random.random()) >&g

随机推荐