• Java的Random类详解


    Random类专门用于生成一个伪随机数,它有两个构造器:一个构造器使用默认的种子(以当前时间作为种子),另一个构造器需要程序员显示传入一个long型整数的种子。

    Random类比Math类的random()方法提供了更多的方式来生成各种伪随机数,可以生成浮点类型的伪随机数,也可以生成整数类型的伪随机数,还可以指定生成随机数的范围。Random类的常用用法如下示例:

    public class Test {
        public static void main(String[] args) {
            Random rand = new Random();
            System.out.println("rand.nextBoolean():" + rand.nextBoolean());
            // 生成0.0-1.0之间的伪随机double数
            System.out.println("rand.nextDouble():" + rand.nextDouble());
            // 生成0.0-1.0之间的伪随机float数
            System.out.println("rand.nextFloat():" + rand.nextFloat());
            // 生成一个处于int整数取值范围的伪随机数
            System.out.println("rand.nextInt():" + rand.nextInt());
            // 生成0-20之间的伪随机整数
            System.out.println("rand.nextInt(20):" + rand.nextInt(20));
            // 生成一个处于long整数取值范围的伪随机数
            System.out.println("rand.nextLong():" + rand.nextLong());
        }
    }

    运行结果:

    rand.nextBoolean():false
    rand.nextDouble():0.642852533214433
    rand.nextFloat():0.2703439
    rand.nextInt():1773302756
    rand.nextInt(20):3
    rand.nextLong():1175156863283867437

    从上面程序可以看出,Random可以提供很多选项来生成伪随机数。

    Random使用一个48位的种子,如果这个类的两个实例是用同一个种子创建的,对它们的方法以同样的顺序调方法,则它们会产生相同的数字序列。也就是说,Random产生的数字并不是真正的随机,而是一种伪随机。

    为了避免两个Random对象产生相同的数字序列,通常推荐使用当前时间作为Random对象的种子,如下代码所示:

    Random rand = new Random(System.currentTimeMillis());

    在并发访问的环境下,使用ThreadLocalRandom来代替Random可以减少多线程资源竞争,最终保证系统具有更好的线程安全性。ThreadLocalRandom的用法与Random基本相似,它提供了一个静态的current()方法来获取ThreadLocalRandom对象,获取该对象之后即可调用各种nextXxx()方法来获取伪随机数。下面代码示范了ThreadLocalRandom的用法:

    ThreadLocalRandom rand = ThreadLocalRandom.current();
    //生成一个5-20之间的随机数
    int r1 = rand.nextInt(5,20);        
    //生成一个5.0-20.0之间的随机浮点数
    double r2 = rand.nextDouble(5.0, 20.0);
  • 相关阅读:
    web工作流管理系统开发之十八 工作流会签的相关实现
    工作流系统之三十一 回退流的实现
    web工作流管理系统开发之五 开源osworkflow之用户系统改造
    web工作流管理系统开发之十九 工作流系统的事务处理
    web工作流管理系统开发之十五 流程变量与表达式
    工作流系统开发之二十二 dotnet版工作流引擎
    web工作流管理系统开发之十七 任务管理
    利用httpclient+jericho多线程实现抓取网页内容
    工作流系统之二十六 .net工作流系统之扩展性
    工作流系统之二十九 详解工作流实例的一次流转
  • 原文地址:https://www.cnblogs.com/bingyimeiling/p/10645803.html
Copyright © 2020-2023  润新知