`
lan_qie
  • 浏览: 12540 次
社区版块
存档分类
最新评论

java伪随机数

 
阅读更多

 java的随机数我们用的很多,但是java随机数的发生器是什么原理呢?一直没有搞明白,最近搞了一下贴出来看看

概念

1、随机数:新的随机数与上一个数无关,不可追溯,不可预测

2、随机数发生器:产生随机数的方法

3、真正的随机数:真正的随机数一般都是由物理现象产生的

4、伪随机数:是由固定的、可以重复计算的算法产出

伪随机数发生器的评判标准

1.符合统计学的平均性---均匀性

2.相同序列的概率非常低---随机性

3.不应该能够从一段序列猜测出随机数发生器的工作状态或者下一个随机数---不可预测

4.不应该从随机数发生器的状态能猜测出随机数发生器以前的工作状态---不可回溯

一般用的随机数发生器满足1和2就可以了,对密码学上使用的随机数发生器还需要满足3和4

用的比较多的是线性同余法

线性同余方法(LCG)

 同余:两个整数ab,若它们除以整数m所得的余数相等,则称ab对于模m同余

数学表示为:a ≡ b (mod m)

LCG根据递归公式

   xn+1≡ (axn+ c ) (mod m)   a,c,m是常数

给定x0产生的随机数列{xi}称为LCG{a,c,m,x0}序列

当c ≠ 0时为混合同余法(MLCG)

当c = 0时为乘同余法(PMLCG)

JAVA API中用的是混合同余法

LCG序列的周期性

   xn+1≡ (7xn+ 7 ) (mod 10) x0=7时得到

  的序列是:

7,6,9,0,7,6,9,0,7…..

从列子中可以看出LCG序列是有周期性的,我们把xk=x0时的最小正整数k称为序列的周期d,LCG序列的最大周期不可能大于除数m,当d=m时,称该序列达到满周期(最大周期)

LCG达到满周期的条件

要令LCG达到满周期,应符合以下条件:

1.c,m互质

2.m的所有质因子的积能整除a-1

3.若m是4的倍数,a-1也是

4.a,c,x0都比m小

5.a,c是正整数

证明(混合线性同余发生器的周期分析.pdf~~~

达到满周期说明LCG序列是均匀的,并且不易重复(取决于m的大小),因为达到满周期说明一个循环里每一个数据都被取到,是均匀的,并且在一个周期内都不会重复

LCG的效能

 效能:具有满周期的线性同余序列的效能被定义使得(a-1)s 0 (mod m)的最小整数s

当满足满周期的条件时,s总是存在的,因为bm的每个素数的倍数

根据经验和实际检验的效果当效能达到5时才能保证随机性

证明~~请参看《计算机程序设计艺术(第二卷)》的3.2.1.3节

JAVA的随机数

常用的随机数类java.util.Random(Math.random也使用此类),使用混合线性同余法生成随机数

混合线性同余法主要的4个初始化参数:

a=25214903917(乘数multiplier)

c=11(增量addend)

m=2^48(模数mask)

x0=种子seed

其中acm满足满周期的条件,同时效能是24,说明均匀性和随机性都很好

因为a,c,m的参数都一样,所以相同的种子就会产生相同的随机序列

默认的种子是用时间+增长序列,同一个jvmrandom的初始种子几乎不会重复,请看源码:

public Random() { this(++seedUniquifier + System.nanoTime()); }
private static volatile long seedUniquifier = 8682522807148012L;

 这个类中最重要的方法是

protected int next(int bits) {
    long oldseed, nextseed;
    AtomicLong seed = this.seed;
    do {
        oldseed = seed.get();
        nextseed = (oldseed * multiplier + addend) & mask;
    } while (!seed.compareAndSet(oldseed, nextseed));
    return (int)(nextseed >>> (48 - bits));
}

 从源码中我们可以看出,random只产生int型的随机数,并且保证了同一个对象即使在多线程情况下也不会产生一样的随机数,产生的int随机数是从高位开始截取的,也就是保留高位,去掉低位

 

nextInt方法

 

public int nextInt() {
    return next(32);
}
 

 

nextLong方法是两个nextInt加起来的

 

public long nextLong() {
    return ((long)(next(32)) << 32) + next(32);
}
 

 

nextDouble()方法是两个27位的随机数相加,然后除以2^54

public double nextDouble() {
    return (((long)(next(26)) << 27) + next(27)) / (double)(1L << 53);
}

 

分享到:
评论

相关推荐

    伪随机数发生器

    ### 伪随机数发生器详解 #### 一、概述 伪随机数发生器(Pseudo-Random Number Generator, PRNG)是一种能够生成一系列看似随机但实际上是由确定性算法产生的数字序列的程序或硬件设备。这些数字虽然不是真正的...

    伪随机数在Java中的应用研究.pdf

    Java中的伪随机数生成在软件开发中扮演着重要的角色,特别是在模拟、测试、加密和游戏等领域。伪随机数并非真正的随机数,它们是由确定性的算法根据一个起始值(种子)计算出来的。Java提供了多种方式来生成这些伪...

    生成伪随机数.rar

    在计算机科学和编程领域,伪随机数生成是至关重要的一个环节。这些数字看似随机,但实际上是由确定性算法生成的,因此称为“伪”随机。在各种应用中,如模拟、加密、游戏、测试等,都需要使用到伪随机数。本资料...

    一种基于混沌的伪随机数生成器

    本文将深入探讨一种特殊的伪随机数生成器——“基于混沌的伪随机数生成器”,并关联其与混沌理论以及序列密码的相关知识。 混沌理论是数学和物理学的一个分支,它研究的是看似随机但其实具有确定性的复杂动态系统。...

    java随机生成数字和字母

    - **`java.util.Random`类**:Java中的`Random`类提供了一种方式来生成伪随机数。 - **ASCII码表**:字符在计算机中是以ASCII码的形式存储的,不同的数字对应着不同的字符。例如,大写字母A的ASCII码值为65。 #### ...

    rsa素数生成及加密算法

    可以随机生成素数,并生成公钥私钥,对明文进行加密。

    JAdvancedNoise:用于创建自定义伪随机数的 Java 库

    Java编程语言在许多领域都有着广泛的应用,其中之一就是生成伪随机数。在游戏开发、图像渲染、模拟计算等领域,高质量的伪随机数生成器(PRNG)是至关重要的。"JAdvancedNoise"是一个专门为Java开发者设计的库,旨在...

    伪随机数算法

    在Java编程语言中,生成伪随机数的类主要集中在`java.util.Random`包中。理解这些算法对于编写高效、可靠的程序至关重要。 伪随机数算法并非真正的随机,而是通过确定性的数学公式或算法生成看起来随机的数字序列。...

    JavaLibrary:Java库

    伪随机数生成--math.XorShiftVariable.java 计时器--util.Counter.java 与数组相关的--util.ArrayUtility.java 与日期相关的--util.DateUtility.java 字符串操作--util.StringUtility.java 类似的搜索--util.SearchE

    java 随机产生指定长度的用户名字母 数字格式

    1. **Random 类的使用**:`java.util.Random` 是Java中的一个类,用于生成伪随机数。 2. **字符数组与StringBuffer 的使用**:字符数组用来存储可能被选中的字符集;`StringBuffer` 用来构建最终的随机字符串。 3. *...

    浅谈Java随机数的原理、伪随机和优化

    Java的随机数生成基于伪随机数算法,这意味着生成的序列看似随机,但实际上是由一个初始种子决定的。如果使用相同的种子,`Random`类将生成相同的随机数序列,这对于可重复测试非常有用。可以通过`setSeed(long seed...

    ApigeeEdge-Java-SecureRandom:使用java.security.SecureRandom在Apigee Edge策略内生成伪随机数的Java标注

    Java安全伪随机数生成器此目录包含为Apigee Edge编译简单的Java标注所需的Java源代码和pom.xml文件。 标注使用java.security.SecureRandom在策略Apigee Edge代理内生成随机数(int,UUID或高斯值),并使用该信息...

    java 随机生成整数

    代码中使用`Math.random()`函数来生成介于0(包括)和1(不包括)之间的伪随机数。为了得到1到100之间的随机整数,开发者进行了如下转换: ```java arr[i] = (int)(Math.random() * 100) + 1; ``` 这里,`Math....

    suijishu.rar_伪随机

    相反,我们使用一种称为伪随机数生成器(Pseudo-Random Number Generator, PRNG)的算法来产生看似随机但实际上可预测的数字序列。 伪随机数发生器基于数学公式或算法,这些公式或算法在给定初始值(称为种子)时,...

    JAVA的随机抽号V代码

    - **`Math.random()`**:返回一个介于0.0(包括)和1.0(不包括)之间的伪随机数。 - **`(int)(Math.random() * i) + 1`**:生成一个1到`i`之间的随机整数。这里通过乘以最大值`i`然后取整来实现。 ### 4. 类的构造...

    cryptic-sequences:一个允许生成伪随机数的库,伪随机数也保证是唯一的

    “加密序列”是一种库,它允许人们生成伪随机数,这些伪随机数也保证是唯一的。 为什么 例如,这对于生成对用户可见的唯一标识符很有用,但不会泄漏有关到目前为止已生成的标识符数量,给定标识符是否已在另一个...

    随机生成6位数

    `Random`类是Java标准库提供的用于生成伪随机数的工具类。 3. **生成随机数字字符串**: ```java String result = ""; for (int i = 0; i ; i++) { result = result + array[rand.nextInt(10)]; } ``` 在这...

    java随机生成验证码

    以下是一个简单的Java验证码生成器伪代码示例: ```java import javax.imageio.ImageIO; import java.awt.*; import java.awt.font.*; import java.awt.geom.AffineTransform; import java.awt.image.BufferedImage...

Global site tag (gtag.js) - Google Analytics