一、Random类
Random类主要是生成随机数。
Random类是专门用于生成一个伪随机数的类,其产生的随机数是根据种子和顺序决定的;ThreadLocalRandom类是Java 7新增的一个类,它是Random的增强版。在并发访问的环境下,保证系统具有更好的线程安全性。Random类有两个构造器:
1、Random():创建一个新的随机数生成器。
2、Random(long seed):使用单个long种子创建一个新的随机数生成器。
1.1基本用法:
1.随机生成int取值范围内的数
int num1 = ran.nextInt(); System.out.println(num1);
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VwKwlTkF-1652098265568)(C:\Users\Hp\AppData\Roaming\Typora\typora-user-images\image-20220509182048506.png)]
2.随机出int类型0~9的数字
int num2 = ran.nextInt(10);//底层原理:随机获取正整数的数字%10 System.out.println(num2);
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-acJKHGZx-1652098265571)(C:\Users\Hp\AppData\Roaming\Typora\typora-user-images\image-20220509182235453.png)]
3.随机出double取值范围内的数据
double num3 = ran.nextDouble(); System.out.println(num3);
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-arCqYpbo-1652098265572)(C:\Users\Hp\AppData\Roaming\Typora\typora-user-images\image-20220509182409357.png)]
4.随机出boolean类型的值
boolean bool = ran.nextBoolean(); System.out.println(bool);
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XUfFnHWP-1652098265572)(C:\Users\Hp\AppData\Roaming\Typora\typora-user-images\image-20220509182500032.png)]
1.2应用 – 点名器
将所有的学生姓名放在一个数组内,数组是已知的长度,长度为学生的个数,通过生成随机数去匹配学生在数组的下标,即可找到随机的学生。
public static void main(String[] args) { String[] names = {"罗菌鱼","张三","李四","王二麻子","赵五","钱六"}; Random ran = new Random(); int index = ran.nextInt(names.length); System.out.println(names[index]); }
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-geKOO6To-1652098265573)(C:\Users\Hp\AppData\Roaming\Typora\typora-user-images\image-20220509183035431.png)]
1.3种子数
种子数固定,随机出的数字就是固定的
public class Random { public Random() { //调用本类其他的构造方法 this(seedUniquifier() ^ System.nanoTime()); } private static long seedUniquifier() { for (;;) { //获取了一个值 long current = seedUniquifier.get(); //算法 long next = current * 181783497276652981L; //判断next达到某个条件后,返回数据 if (seedUniquifier.compareAndSet(current, next)) return next;//返回了一个较为随机的值 } } //有参构造 -- 传入的数据是种子数 public Random(long seed) { if (getClass() == Random.class) this.seed = new AtomicLong(initialScramble(seed)); else { // subclass might have overriden setSeed this.seed = new AtomicLong(); setSeed(seed); } } }