Java中的Random类

**

Random类

**

引言:

Random类中实现的随机算法是伪随机,也就是有规则的随机。 --百度资料

首先来介绍一下,java里面配备了一个Random类,这个类对于学人工智能的同学是比较重要的,因为在算法训练数据集的时候是需要使用到的一个东西,但是大多数是在python上面使用random,不过这不影响这个Random在java里面的重要性。
—————————————————————————————————

在使用Random函数时,先要引入Random模板在进行使用

**

import java.util.Random;

**

—————————————————————————————————

1.在java里面Random类里面包含了两个构造函数,首先第一个就是
在这里插入图片描述
在这里插入图片描述

第一个 public Random() 用于创建一个随机数生成器,每次实例化Random()对象会生成不同的随机数。

第二个是public Random(long seed) 使用一个long型的seed(种子)创建伪随机数生成器,当seed相同时,每次实例化Random对象都会生成相同的随机数.

—————————————————————————————————

Random类有几个常用的方法:

public boolean nextBoolean():是生成一个随机的boolean值,生成truefalse的值几率相等,也就是都是50%的几率。

public double nextDouble():是生成一个随机的double值,数值介于[0,1.0)之间。


public int nextInt():是生成在-2^312^31-1之间int值。如果需要生成指定区间的int值,则需要进行一定的数学变换,具体可以参看下面的使用示例中的代码。

public int nextInt(int n):是生成一个介于[0,n)的区间int值,包含0而不包含如果想生成指定区间int值,也需要进行一定的数学变换,具体参看下面的使用示例中的代码。

public void setSeed(long seed):是重新设置Random对象中的种子数。设置完种子数以后的Random对象和相同种子数使用new关键字创建出的Random对象相同。

public float nextFloat(int n):返回下一个伪随机数,它是取自此随机数生成器序列的、在 0.01.0 之间均匀分布的  float 值。

public long nextLong():返回下一个伪随机数,它是取自此随机数生成器序列的均匀分布的 long 值。

public double nextGaussian():返回下一个伪随机数,它是取自此随机数生成器序列的、呈高斯(“正态”)分布的 double 值,其平均值是 0.0,标准差是 1.0

—————————————————————————————————

下面不使用构造函数初始化seed进行代码的运行并看一下随机数的结果:

代码如下:

/**
 * @Author 小青
 * @Date 2021-10-26 12:21
 * @Version 1.0
 */
 
import java.util.Random;


public class text2_2021_10_26 {
    public static void main(String[] args) {
        //使用random函数进行产生随机数
        Random rand = new Random();
        for(int i = 0; i < 5; i++) {
            //下面的是产生20 + 1~10之间的整数
            int num1 = rand.nextInt(10);

            //下面产生的是0~1之间的单精度浮点数
            float num2 = rand.nextFloat();

            //下面产生的是true或者是false的boolean类型
            boolean num3 = rand.nextBoolean();

            System.out.println(num1);
            System.out.println(num2);
            System.out.println(num3);

        }
    }
}

运行结果如下:

9
0.40046793
true
7
0.87891114
true
1
0.4709146
true
8
0.7713199
false
8
0.20616794
false
Process finished with exit code 0

—————————————————————————————————
接下来使用定义一个随机种子试一下运行的结果:

/**
 * @Author 小青
 * @Date 2021-10-26 12:21
 * @Version 1.0
 */

import java.util.Random;

public class text2_2021_10_26 {
    public static void main(String[] args) {
        //使用random函数进行产生随机数


        //***********************************************
        Random rand1 = new Random(10);
        Random rand2 = new Random(10);
        //***********************************************

        int num1 = rand1.nextInt();
        int num2 = rand2.nextInt();

        System.out.println(num1 + "    " + num2);
        }
    }


运行结果:

-1157793070 -1157793070

上面的就是创建了两个对象,赋予它们的long seed是相同,所以我们发现最后的运行结果是相同的。

—————————————————————————————————

上面的这些也许还不能让读者更好地了解到Random类的有趣之处,那么接下来通过一个小小的游戏进行对Random类进行了解一下:

下面来一个我们的课后作业:
问题:设计一个Person类,包含姓名和生日,在无参构造函数中随机产生姓名和生日,姓名由6个英文字母组成,第一个字母大写,其他字母小写,生日从1990年1月1日至2008年12月31日随机产生。在introduce函数中作自我介绍,输出姓名和生日(格式:2008年12月31日 12:05), 注意:生日用Calendar类。
代码如下:

/**
 * @Author 陈辉明
 * @Date 2021-10-26 18:07
 * @Version 1.0
 */


import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Random;


class Person {
    private String name;
    private Date birthday;

    //构造函数
    public Person() {
        this.name = randomName();
        Calendar cal = Calendar.getInstance();
        Random r = new Random();
        cal.set(Calendar.YEAR, 1990 + r.nextInt(2008 - 1900));
        cal.set(Calendar.MONTH, r.nextInt(11));     //因为英文的月份是从零开始
        cal.set(Calendar.DATE, 1 + r.nextInt(30));
        this.birthday = cal.getTime();
    }

    public String getName() {
        return name;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void introduce() {

        //下面是指定一个输出的生日格式
        SimpleDateFormat sf = new SimpleDateFormat("Gyyyy年MM月dd日");
        System.out.println("我的英文名字是 " + name + ", 我出生在" + sf.format(birthday));
    }

    private String randomName() {
        StringBuffer sb = new StringBuffer();
        Random r = new Random();

        //产生一个大写
        sb.append((char)(r.nextInt(26) + 65));

        for (int i = 0; i < 5; i++) {
            sb.append((char)(r.nextInt(26) + 97));
        }
        return sb.toString();
    }
}

public class text3_2021_10_26 {

    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            Person p = new Person();
            p.introduce();
        }
    }
}

下面是运行的结果:
因为每一次运行的结果都是随机的,所以这个知识给大家作为参考。
在这里插入图片描述

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值