zoukankan      html  css  js  c++  java
  • Java Random介绍

    一、简介

    Random类位于java.util包下,此类的实例用于生成伪随机数流。之所以称之为伪随机,是因为真正意义上的随机数(或者称为随机事件)在某次产生过程中是按照实验过程表现的分布概率随机产生的,其结果是不可预测,不可见的。而计算机中的随机函数是按照一定的算法模拟产生的,其结果是确定的,可见的。我们认为这样产生的数据不是真正意义上的随机数,因而称之为伪随机。
     

    二、Random类的使用

    2.1 生成Random对象

    Java API中提供了两个构造方法来new一个Random对象。无参构造底层调用的也是有参构造,将System.nanoTime()作为参数传递。即如果使用无参构造,默认的seed值为System.nanoTime()。
    在JDK1.5版本以前,默认的种子用的是System.currentTimeMillis()。这里简单说明下System.nanoTime()与System.currentTimeMillis()的区别。System.currentTimeMillis()产生一个当前的毫秒,这个毫秒是自1970年1月1日0时起到当前的毫秒数。而System.nanoTime()是从某个不确定的时间起(同一个的虚拟机上起始时间是固定的),到当前的时间差,它精确到纳秒,这个不确定的起始时间可以是未来,如果起始时间是未来,得到的就是个负数。它的主要用途是衡量一个时间段,比如说一段代码所执行的时间。
    Random random = new Random()
    Random random2 = new Random(long seed)
    对于有参构造,需要注意的是,如果seed值相同,不管执行多少次,随机生成的数据是相同的,具体看下例:
    package dailytest;
     
    import java.util.Random;
     
    import org.junit.Test;
     
    /**
     * Random类学习
     * @author yrr
     *
     */
    public class RandomTest {
       
        /**
         * 使用有参数构造生成Random对象
         * 不管执行多少次,每次得到的结果都相同
         *  -1157793070
         *   1913984760
         *   1107254586
         */
        @Test
        public void test01(){
            Random random = new Random(10);
            for (int i = 0; i < 3; i++) {
                System.out.println(random.nextInt());
            }
        }
       
    }
     

    2.2 Random类中的方法

    简单方法如下所示
    /**
         * 测试Random类中的简单方法
         */
        @Test
        public void test02() {
            Random random = new Random();
            System.out.println("nextInt():" + random.nextInt());   //随机生成一个整数,这个整数的范围就是int类型的范围-2^31~2^31-1
            System.out.println("nextLong():" + random.nextLong());      //随机生成long类型范围的整数
            System.out.println("nextFloat():" + random.nextFloat());    //随机生成[0, 1.0)区间的小数
            System.out.println("nextDouble():" + random.nextDouble());  //随机生成[0, 1.0)区间的小数
           
            byte[] byteArr = new byte[10];
            random.nextBytes(byteArr);  //随机生成byte,并存放在定义的数组中,生成的个数等于定义的数组的个数
            for (int i = 0; i < byteArr.length; i++) {
                System.out.println(byteArr[i]);
            }
           
            /**
             * random.nextInt(n)
             * 随机生成一个正整数,整数范围[0,n)
             * 如果想生成其他范围的数据,可以在此基础上进行加减
             *
             * 例如:
             * 1. 想生成范围在[0,n]的整数
             *      random.nextInt(n+1)
             * 2. 想生成范围在[m,n]的整数, n > m
             *      random.nextInt(n-m+1) + m 
             *      random.nextInt() % (n-m) + m
             * 3. 想生成范围在(m,n)的整数
             *      random.nextInt(n-m+1) + m -1
             *      random.nextInt() % (n-m) + m - 1
             * ...... 主要是依靠简单的加减法  
             */
            System.out.println("nextInt(10):" + random.nextInt(10)); //随机生成一个整数,整数范围[0,10)
            for (int i = 0; i < 20; i++) {
                //[3,15)
                //这里有坑,需要注意,如果前面用了+号,应该要把计算结果整体用括号括起来,不然它会把+号解释为字符串拼接
                System.out.println("我生成了一个[3,15)区间的数,它是:" + (random.nextInt(12) + 3));
            }
        }
    JDK1.8新增方法:
    package dailytest;
     
    import java.util.Random;
     
    import org.junit.Test;
     
    /**
     * Random类学习
     * @author yrr
     *
     */
    public class RandomTest {
        /**
         * 测试Random类中 JDK1.8提供的新方法
         * JDK1.8新增了Stream的概念
         * 在Random中,为double, int, long类型分别增加了对应的生成随机数的方法
         * 鉴于每种数据类型方法原理是一样的,所以,这里以int类型举例说明用法
         */
        @Test
        public void test03() {
            Random random = new Random();
            random.ints();  //生成无限个int类型范围内的数据,因为是无限个,这里就不打印了,会卡死的......
            random.ints(10, 100);   //生成无限个[10,100)范围内的数据
           
            /**
             * 这里的toArray 是Stream里提供的方法
             */
            int[] arr = random.ints(10).toArray();  //生成10个int范围类的个数。
            System.out.println(arr.length);
            for (int i = 0; i < arr.length; i++) {
                System.out.println(arr[i]);
            }
           
           
            //生成5个在[10,100)范围内的整数
            random.ints(5, 10, 100).forEach(System.out :: println); //这句话和下面三句话功能相同
            //forEach等价于:
            arr = random.ints(5, 10, 100).toArray();
            for (int i = 0; i < arr.length; i++) {
                System.out.println(arr[i]);
            }
           
            /**
             * 对于
             *      random.ints();
             *      random.ints(ori, des);
             * 两个生成无限个随机数的方法,我们可以利用Stream里的terminal操作,来截断无限这个操作
             */
            //limit表示限制只要10个,等价于random.ints(10)
            random.ints().limit(10).forEach(System.out :: println);
           
            //等价于random.ints(5, 10, 100)
            random.ints(10, 100).limit(5).forEach(System.out :: println);
        }
       
    }
  • 相关阅读:
    使用C#实现DHT磁力搜索的BT种子后端管理程序+数据库设计(开源)
    便携版WinSCP在命令行下同步文件夹
    ffmpeg (ffprobe)分析文件关键帧时间点
    sqlite删除数据或者表后,回收数据库文件大小
    ubuntu 20.04下 freeswitch 配合 fail2ban 防恶意访问
    ffmpeg使用nvenc编码的结论记录
    PC版跑跑卡丁车 故事模式 亚瑟传说章节 卡美洛庆典 2阶段 心灵之眼 攻略
    There was an error loading or playing the video
    Nvidia RTX Voice 启动报错修复方法
    火狐浏览器 关闭跨域限制
  • 原文地址:https://www.cnblogs.com/yrrAwx/p/7806444.html
Copyright © 2011-2022 走看看