javaSE学习-随机数类java.util.Random类介绍

  • 随机数介绍

在程序开发中,我们经常会用到随机数。譬如数字签名、数据加密、以及一些取样的场景下。但需要注意的是,许多开发语言API 所提供的随机函数并非真正意义上的随机,而是伪随机,至于原因,本文最后会进行解释。

  • jdk中Random类

jdk中提供了Random类供我们使用

	        // within int range
		System.out.println(new Random().nextInt());

		// [0,23)
		System.out.println(new Random().nextInt(23));

		// [0.0,1.0)
		System.out.println(new Random().nextDouble());

		// [0.0,1.0)
		System.out.println(new Random().nextDouble());

		// generate true or false with equal probability
		System.out.println(new Random().nextBoolean());
  • 种子

值得注意的是Random类中提供了另外一个带参构造函数 Random(long seed)

我们输入下面代码

Random random1 = new Random(23);
for (int i = 0; i < 5; i++) {
System.out.println(random1.nextInt());
}
Random random2 = new Random(23);
for (int i = 0; i < 5; i++) {
System.out.println(random2.nextInt());
}
某次结果如下

-1150482841
1434614297
156591366
825130495
960144037
-------------
-1150482841
1434614297
156591366
825130495
960144037

有读者可能感到困惑,为什么两个Random 独立生成出的数字序列完全相同,对,不必疑惑!即使生成10000次,他们生成的随机数序列也完全相同!

这也是本文开头所说的伪随机。

大部分的开发语言中,随机数产生都采用了线性同余法

数学表达式如下

X(n+1) = (a * X(n) + c) % m

所以,随机数值是其实是通过公式算出来的。当你在构造不同的Random类时传入了相同的种子(Seed)时候,必然会得到相同的数字序列!

我们观察下jdk产生随机数的核心函数:

     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));
    }

其中(oldseed * multiplier + addend) & mask就是采用了线性同余法。只不过jdk开发者进行了一些处理而已。
而我们使用无参构造函数时,会默认使用时间作为种子,所以,即使定义了若干Random 类,他们产生的随机数序列也不会相同。
好了,今天学习就到这里,下次我们讲讲 Apache Commons Lang 中的 RandomUtils类

时间: 2024-11-10 21:13:28

javaSE学习-随机数类java.util.Random类介绍的相关文章

java.util.Random 类的 nextInt(int num )

随机产生3个67~295的整数并找出数值居中的数 并输出中间的数例如:100,225和200,输出200 要随机产生某个范围内的整数,用 java.util.Random 类的 nextInt(int num) 最简洁. nextInt( int num) 能接受一个整数作为它所产生的随机整数的上限,下限为零,比如:nextInt(4)将产生0,1,2,3这4个数字中的任何一个数字,注意这里不是0-4,而是0-3..但下限总是零,不能更改,所以若要达到非零下限的效果,必须把上限减去下限的结果传给

JAVA的Random类介绍

Random类 (java.util)  Random类中实现的随机算法是伪随机,也就是有规则的随机.在进行随机时,随机算法的起源数字称为种子数(seed),在种子数的基础上进行一定的变换,从而产生需要的随机数字. 相同种子数的Random对象,相同次数生成的随机数字是完全相同的.也就是说,两个种子数相同的Random对象,第一次生成的随机数字完全相同,第二次生成的随机数字也完全相同.这点在生成多个随机数字时需要特别注意. 下面介绍一下Random类的使用,以及如何生成指定区间的随机数组以及实现

java的Random类详解

Random类是一个专门用来生成一个伪随机数的类,这个类提供了两个构造函数,一个使用默认的种子,另一个需要程序员显示传入一个long型整数的种子.与Math类中的random方法生成的伪随机数不同的是,Math的random方法生成的伪随机数取值范围是[0,1.0),Random类不仅可以生成浮点数的伪随机数,还可以生成整数类型的伪随机数,还可以指定伪随机数的范围非常好用..下面是转载的博客园中的一篇文章讲解的非常好. Random类 (java.util) Random类中实现的随机算法是伪随

JAVA的Random类(转)

Random类 (java.util) Random类中实现的随机算法是伪随机,也就是有规则的随机.在进行随机时,随机算法的起源数字称为种子数(seed),在种子数的基础上进行一定的变换,从而产生需要的随机数字. 相同种子数的Random对象,相同次数生成的随机数字是完全相同的.也就是说,两个种子数相同的Random对象,第一次生成的随机数字完全相同,第二次生成的随机数字也完全相同.这点在生成多个随机数字时需要特别注意. 下面介绍一下Random类的使用,以及如何生成指定区间的随机数组以及实现程

java.util.Math类--数学相关的工具类

Math类--数学相关的工具类 java.util.Math类是数学相关的工具类,里面提供了大量的静态方法,完成与数学运算相关的操作. public static double abs(double num);获取绝对值.有多种重载: public static double ceil(double num);向上取整. public static double floor(double num);向下取整. public static long round(double num);四舍五入.

java.util.Properties类 学习笔记

学习目标: 1.认识properties文件,理解其含义,会正确创建properties文件. 2.会使用java.util.Properties类来操作properties文件. 3.掌握相对路径,能正确书写一个properties文件的相对路径. 一.认识properties文件 1.properties文件是一个文本文件 2.properties文件的语法有两种,一种是注释,一种属性配置. 注    释:前面加上#号 属性配置:以“键=值”的方式书写一个属性的配置信息. 3.propert

java之Random类

1.Random类概述及其构造方法 此类用于产生随机数. 如果用相同的 种子创建两个Random实例,则对每个实例进行相同的方法调用序列,他们将生成并返回相同的数字序列. 2.构造方法 public Random() public Random(omt seed) //seed种子数 package cn; import java.util.Random; /**  * Random类   * 构造方法  * public Random()  * public Random(int seed)

Java API —— Random类

1.Random类概述 此类用于产生随机数 如果用相同的种子创建两个 Random 实例,则对每个实例进行相同的方法调用序列,它们将生成并返回相同的数字序列. 2.构造方法 public Random() : 创建一个新的随机数生成器,没有给种子,默认种子是当前时间的毫秒值 public Random(long seed):使用单个long种子创建一个新的随机数生成器,给定种子后,每次的得到的随机数都是一样的. 3.Random类成员方法 public int nextInt():返回下一个伪随

java常用类--------Math和Random类

一.Math类 package cn.zxg.PackgeUse; /** * 测试Math类 */public class TestMath { public static void main(String[] args) { //取整相关 System.out.println(Math.ceil(3.2)); //绝对值.开方.a的b次幂 System.out.println(Math.abs(-45)); System.out.println(Math.sqrt(64)); System.