Random 类作为JAVA中用于产生的随机数 ,new  Random(10)  :10是种子数。
注意:Random 的一个特点是:相同种子数的Random对象,对应相同次数生成的随机数字是完全相同
 
验证代码:
       Random r1 = new Random(10);
 
        Random r2 = new Random(10);
 
        for(int i = 0;i < 4;i++){
 
                 System.out.println(r1.nextInt(5));
        }
System.out.println("++++++++++++++++++++++");
        for(int i = 0;i < 4;i++){
 
                 System.out.println(r2.nextInt(5));
        }
结果:r1 产生的随机数
3
0
3
0
++++++++++++++++++++++
3       r2产生的随机数
0
3
0
换成: 
System.out.println(r1.nextDouble(5))System.out.println(r2.nextDouble(5))
结果:
0.7304302967434272
0.2578027905957804
0.059201965811244595
0.24411725056425315
++++++++++++++++++++++
0.7304302967434272
0.2578027905957804
0.059201965811244595
0.24411725056425315
 
分析: 虽然说是随机数发生器,但是还是按照某种算法一步一步执行下去的,种子数一定算法一样那么同一时刻的产生的数值当然该一样了!!
 

* @param seed the initial seed
* @see #setSeed(long)
*/

++++++++++++++++++带种子数的构造方法+++++++++++++
public Random(long seed) {
if (getClass() == Random.class)
this.seed = new AtomicLong(initialScramble(seed));
else {
// subclass might have overriden setSeed
this.seed = new AtomicLong();
setSeed(seed);
}
}

++++++++++++++netInt方法带参数的那个源码++++++++++++

* @since 1.2
*/

public int nextInt(int n) {
if (n <= 0)
throw new IllegalArgumentException("n must be positive");

if ((n & -n) == n) // i.e., n is a power of 2
return (int)((n * (long)next(31)) >> 31);

int bits, val;
do {
bits = next(31);
val = bits % n;
} while (bits - val + (n-1) < 0);
return val;
}

可见Random的种子要求 大于0 的 。。。

+++++++++++++++nextDouble方法实现+++++++++++

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

+++++++++++++++nextFloat方法实现+++++++++++++

public float nextFloat() {
return next(24) / ((float)(1 << 24));
}

+++++++++++++++++nextInt方法实现:++++++++++
public int nextInt() {
return next(32);
}

 
可见所有的随机数产生都和一个叫 next方法有关,这个方法是这样的:

* @since 1.1
*/
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));
}

一般计算机的随机数都是伪随机数,以一个真随机数(种子)作为初始条件,然后用一定的算法不停迭代产生随机数,下面介绍两种方法: 

算法1:平方取中法。 
  1)将种子设为X0,并mod 10000得到4位数 
 
  2)将它平方得到一个8位数(不足8位时前面补0) 
 
  3)取中间的4位数可得到下一个4位随机数X1 
 
  4)重复1-3步,即可产生多个随机数 
 
  这个算法的一个主要缺点是最终它会退化成0,不能继续产生随机数。 
算法2:线性同余法 
 
  1)将种子设为X0, 
 
  2)用一个算法X(n+1)=(a*X(n)+b) mod c产生X(n+1) 
 
  一般将c取得很大,可产生0到c-1之间的伪随机数 
  该算法的一个缺点是会出现循环。
拓展:

Math类中也有一个random方法,该random方法的工作是生成一个[0,1.0)区间的随机小数。

通过阅读Math类的源代码可以发现,Math类中的random方法就是直接调用Random类中的nextDouble方法实现的。

* @see Random#nextDouble()
*/
public static double random() {
Random rnd = randomNumberGenerator;
if (rnd == null) rnd = initRNG();
return rnd.nextDouble();
}

参考:http://www.cnblogs.com/Coffee-guy/p/3378776.html

http://blog.sina.com.cn/s/blog_4b3120470100k96z.html

java中Random(long seed)方法与rRandom()方法的使用产生随机数的更多相关文章

  1. java中random的几个方法的使用Math.random()和random().

    random java中我们有时候也需要使用使用random来产生随机数,下面我来简单的介绍下java中random的使用方法 第一种:Math.random() public static doub ...

  2. Java中获取键盘输入值的三种方法

    Java中获取键盘输入值的三种方法     Java程序开发过程中,需要从键盘获取输入值是常有的事,但Java它偏偏就没有像c语言给我们提供的scanf(),C++给我们提供的cin()获取键盘输入值 ...

  3. Java中Date和Calender类的使用方法

    查看文章     Java中Date和Calender类的使用方法 2009-10-04 20:49 Date和Calendar是Java类库里提供对时间进行处理的类,由于日期在商业逻辑的应用中占据着 ...

  4. JAVA中文件与Byte数组相互转换的方法

    JAVA中文件与Byte数组相互转换的方法,如下: public class FileUtil { //将文件转换成Byte数组 public static byte[] getBytesByFile ...

  5. java中什么是bridge method(桥接方法)

    java中什么是bridge method(桥接方法) https://blog.csdn.net/z69183787/article/details/81115524

  6. (转载)java中判断字符串是否为数字的方法的几种方法

    java中判断字符串是否为数字的方法: 1.用JAVA自带的函数 public static boolean isNumeric(String str){ for (int i = 0; i < ...

  7. java中random()函数用法介绍

    Random() 创建一个新的随机数生成器.  代码如下 复制代码 Random(long seed) 使用单个 long 种子创建一个新的随机数生成器. 我们可以在构造Random对象的时候指定种子 ...

  8. Java中 Random

    Java中的Random()函数 (2013-01-24 21:01:04) 转载▼ 标签: java random 随机函数 杂谈 分类: Java 今天在做Java练习的时候注意到了Java里面的 ...

  9. Java中Random随机数

    java中一般有两种随机数,一个是Math中random()方法,一个是Random类. 一.Math.random() 随即生成0<=x<1的小数. 实例:如何写,生成随机生成出0~10 ...

随机推荐

  1. 分布式定时任务调度系统技术解决方案(xxl-job、Elastic-job、Saturn)

    1.业务场景 保险人管系统每月工资结算,平安有150万代理人,如何快速的进行工资结算(数据运算型) 保险短信开门红/电商双十一 1000w+短信发送(短时汇聚型) 工作中业务场景非常多,所涉及到的场景 ...

  2. 洛谷—— P1609 最小回文数

    https://www.luogu.org/problemnew/show/1609 题目描述 回文数是从左向右读和从右向左读结果一样的数字串. 例如:121.44 和3是回文数,175和36不是. ...

  3. ELK之filebeat收集多类型日志

    1.IP规划 10.0.0.33:filebeat+tomcat,filebeat收集系统日志.tomcat日志发送到logstash 10.0.0.32:logstash,将日志写入reids(in ...

  4. MariaDB主从复制、主主复制

    1.部署 10.0.0.21  MariaDB-21 10.0.0.22  MariaDB-22 cat /etc/yum.repos.d/mariadb.repo [mariadb] name=Ma ...

  5. python 集合互相转换

    #-*-coding:utf-8-*- #1.字典 dict = {'name': 'Zara', 'age': 7, 'class': 'First'} #字典转为字符串,返回:<type ' ...

  6. Akka之BackoffSupervisor

    一.背景 最近在开发一个项目,项目的各模块之间是使用akka grpc传输音频帧的,并且各模块中的actor分别都进行了persist.本周在开发过程中遇到了一个bug,就是音频帧在通行一段时间后,整 ...

  7. ios iPhone 如何将应用程序名称本地化

    iPhone的应用程序名称也可以本地化,可以按照以下步骤来实施: 1. 修改项目目录下的’ -info.plist’文件名 将’ -info.plist’ 修改为 Info.plist 2. 将Inf ...

  8. python核心编程学习(第三版)之字符串匹配

    表示择一匹配的管道符号|,表示一个“从多个模式中选中其一”,有时候也称作并或者逻辑或 点号或者句号.符号匹配出了换行符\n以外的任何字符.如果要匹配句号,只需要使用反斜线转移句号符号的功能. ^匹配字 ...

  9. 【GLSL教程】(六)逐顶点的光照 【转】

    引言 在OpenGL中有三种类型的光:方向光(directional).点光(point).聚光(spotlight).本教程将从方向光讲起,首先我们将使用GLSL来模仿OpenGL中的光. 我们将向 ...

  10. 关于Web项目的pom文件处理

    pom文件的方式需要修改的是 <packaging>war</packaging> <profiles> <profile> <id>com ...