java.util.Random是Java中一个可以生成随机数的类,并且你可以通过传入相关参数来对随机数的范围进行控制,无论在实际开发中,还是学习生活中,Random随机数都能起到比较大的作用。那么今天就来学习一下Random的使用!
相信你肯定抽过奖!那么作为一个程序员,你有没有想过那些抽奖的大转盘,或者是九宫格是怎么实现的呢?又是怎么控制中奖概率的呢?跟着我的脚步,我带你领略Random的风骚!
实例化对象
通过源码可以看到Random类是有两个构造方法的,其中一种是不带参的,还有一种是带有一个long类型参数(称为:种子)的,那么这两种有何区别呢?
不带参:完全随机
带参:传入参数(种子)的Random对象所生成的随机数是固定的
举个栗子,当你实例化两个Random对象时,如果参数(种子)都传入10,那么这两个Random(random1 和 random2)对象所生成的随机数,random1生成的第一个随机数 = random2生成的第一个随机数 ,random1生成的第二个随机数 = random2生成的第二个随机数 ,代码如下:
//实例化Random对象
Random random = new Random();
Random random2 = new Random();
Random random3 = new Random(10);
Random random4 = new Random(10);
for (int i = 0; i < 10; i++) {
int number=random.nextInt();
int number2=random2.nextInt();
int number3=random3.nextInt();
int number4=random4.nextInt();
//输出格式是: 无种子随机数 无种子随机数 有种子随机数 有种子随机数
System.out.println(number+"_"+number2+"___"+number3+"_"+number4);
}
输出结果:
1075217332 -2135067742 -1157793070 -1157793070
-944171219 -837885942 1913984760 1913984760
1314450533 1413088185 1107254586 1107254586
215653709 -337612687 1773446580 1773446580
1737734575 1766714434 254270492 254270492
从输出的五组数来看,可以明显地发现,无种子随机数生成的随机数是完全随机的(没有任何联系),而传入了种子的两个random对象所生成的随机数是一样的,得出结论:传入种子的Random对象所生成的随机数是固定的
注意:种子不会影响随机数的范围
常用方法
Random的几个常用方法都比较简单,这里只列举三种最常用的。
生成 int 类型随机数
这里演示获取多种类型的 int 数据的方法:默认范围 [int最小值,int最大值) 、0~最大范围 [0,max) 、自定义范围 [min , max) 、自定义范围 [min , max] ,当然了这里只演示几种最常用的,还有很多其他类型的,都可以通过不同的公示来进行改变
//生成默认范围(int类型的范围)的随机数
int i = random.nextInt();//[int最小值,int最大值)
//生成自定义 0~最大范围(max)的正整数随机数 [0,max)
int i = random.nextInt(max);//[0,10)
//生成自定义范围随机数 [min , max)
//公式: .nextInt(max) % (max - min) + min
int i=random.nextInt(10)%(10-5)+5;//[5,10)
//生成自定义范围随机数 [min , max]
//公式: .nextInt(max) % (max - min + 1) + min
int i = random.nextInt(10) % (10 - 5 + 1) + 5;//[5,10]
生成 boolean 类型随机数
这个很好理解,就是直接生成 true 和 false 中的一个,概率相同
boolean b = random.nextBoolean();
生成 double 类型随机数
nextDouble()生成的随机数范围是 [0 , 1.0) 的小数
double d = random.nextDouble();
随机数的几种常用用途
随机数在很多地方都用得到,我个人最常见的就是应用在抽奖中了,一个抽奖程序,想要控制各种奖项的概率,用随机数来做再合适不过了!
中奖概率的控制:
中奖概率控制原理:通过获取随机数,然后利用 if 语句先限定中奖的区间,就可以达到一个公平的概率效果!
//首先在 [1,100] 区间(100个数)随机获取一个数
int i = random.nextInt(100) % (100 - 1 + 1) + 1;
System.out.println("当前获取的随机数:" + i);
//然后根据中间概率来设置 if 条件语句的区间,达到效果
if (i >= 80) {// [80,100] 一等奖
System.out.println("恭喜,一等奖!");
} else if (i >= 50) { // [50,80] 二等奖
System.out.println("恭喜,二等奖!");
} else {//[1,50] 谢谢惠顾
System.out.println("很遗憾,没有中奖!");
}
骰子的制作:
//首先在 [1,6] 区间(6个数)随机获取一个数
int i = random.nextInt(6) % (6 - 1 + 1) + 1;
System.out.println("骰子点数:" + i);
硬币正反面也是同理,这里面随机数的区间以及中奖的概率都可以根据实际需要来做调整!