**
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值,生成true和false的值几率相等,也就是都是50%的几率。
public double nextDouble():是生成一个随机的double值,数值介于[0,1.0)之间。
public int nextInt():是生成在-2^31到2^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.0 和 1.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();
}
}
}
下面是运行的结果:
因为每一次运行的结果都是随机的,所以这个知识给大家作为参考。