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. ansible 文件和目录操作

    ansible file 模块参考: refer to https://docs.ansible.com/ansible/latest/modules/file_module.html?highlig ...

  2. Java 8 Comparator: 列表排序

    在本文中,我们将看到几个关于如何在Java 8中对List进行排序的示例. 1.按字母顺序排序字符串列表 List<String> cities = Arrays.asList( &quo ...

  3. BZOJ2870—最长道路tree

    最长道路tree Description H城很大,有N个路口(从1到N编号),路口之间有N-1边,使得任意两个路口都能互相到达,这些道路的长度我们视作一样.每个路口都有很多车辆来往,所以每个路口i都 ...

  4. VS如何反汇编

    1. 打开反汇编窗口:调试模式下,按Ctrl+F11.2. 术语: 2.1 ESP(Extended Stack Pointer): 堆栈指针,寄存器存放当前线程的栈顶指针: i.e: move eb ...

  5. SecureCRT双击Tab快速复制Session

  6. 【报错】项目启动,仅仅报错 One or more listeners failed to start. Full details will be found in the appropriate container log file

    今天spring4.3.13 项目,整合ActiveMQ的时候,项目启动在自动部署到tomcat下的时候,不能正常的部署,仅仅报错如下: Connected to server [-- ::,] Ar ...

  7. VS2010 MFC中 给菜单项添加消息响应函数

    久了没用,居然忘记了该怎样给菜单项添加响应函数了~~~~~~~~T_T 特记于此: 1. 在资源视图的Menu里找到自己要添加的菜单,然后输入菜单项. 2. 右击菜单项选属性,设置Popup为Fals ...

  8. 安卓获取软硬件信息并上传给server(Socket实现)

    首先,项目结构如图--A:分为client部分CheckInfo和server端CheckInfo_Server.CheckInfo获取手机信息(Mac,Cpu,内存,已安装软件信息等)并上传到ser ...

  9. script脚本中写不写$(document).ready(function() {});的差别

    $(document).ready() 里的代码是在页面内容都载入完才运行的,假设把代码直接写到script标签里.当页面载入完这个script标签就会运行里边的代码了,此时假设你标签里运行的代码调用 ...

  10. APT攻击:91%的攻击是利用电子邮件

    一封假冒的"二代医疗保险补充保险费扣费说明",导致上万家中小型企业的资料被窃;一封伪装银行交易纪录的钓鱼信件,让韩国爆发史上最大黑客攻击. APT攻击通常会以电子邮件的形式出现,邮 ...