对于Java来说,生成随机数的方式大概有三种,分别是:通过Math类生成、通过Random类生成和通过ThreadLocalRandom类生成。其中Random和ThreadLocalRandom的使用方式几乎一样,只不过两者使用的场景不一样而已,其中ThreadLocalRandom在多线程中效率更好。
通过ThreadLocalRandom类生成
对于ThreadLocalRandom来说,其使用和Random差不多, 区别在于ThreadLocalRandom在多线程环境下,可以更好减少共享资源的竞争。由于ThreadLocalRandom的使用和Random都差不多,这里就展开来说。仅仅提供一个例子演示一下即可。
通过Math类型生成
关于Math类,我已经在我的过去的文章中有过介绍,这里就不过多提及。这里只说一个方法,也就是:Math.random()方法。
对于Math.random()生成的是一个0-1之间的double类型的随机浮点数。
关于使用Math.random()方法生成随机数的示例代码如下所示:
public class RandomTest {
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
System.out.println("第" + i + "次生成的随机数为:" + Math.random());
}
}
}
例 1
Math 类的 random() 方法没有参数,它默认会返回大于等于 0.0、小于 1.0 的 double 类型随机数,即 0<=随机数<1.0.对 random() 方法返回的数字稍加处理,即可实现产生任意范围随机数的功能。
下面使用 random() 方法实现随机生成一个 2~100 偶数的功能。具体代码如下:由于 m+(int)(Math.random()*n) 语句可以获取 m~m+n 的随机数,所以 2+(int)(Math. random()*(102-2)) 表达式可以求出 2~100 的随机数。在产生这个区间的随机数后还需要判断是否为偶数,这里使用了对 2 取余数,如果余数不是零,说明随机数是奇数,此时将随机数加 1 后再输出。
该程序的运行结果如下:
随机数是:20
通过Random类生成
生成随机数还可以通过Random类来进行生成。对于Random来说,有两个构造器,分别如下:
public Random():无参构造器,默认使用当前系统时间来计算种子
public Random(long seed):带参构造器,需自行传入种子。
因为Random生成的是一个伪随机序列,因此当不同的Random对象的种子相同时,就会产生相同的结果。
示例代码如下图所示:
public class RandomTest {
public static void main(String[] args) {
Random r1 = new Random(50);
Random r2 = new Random(50);
for (int i = 0; i < 5; i++) {
System.out.println("r1的第" + (i + 1) + "次生成的随机数为:" + r1.nextInt());
System.out.println("r2的第" + (i + 1) + "次生成的随机数为:" + r2.nextInt());
}
}
}
例 2
下面编写一个 Java 程序,演示如何使用 Random 类提供的方法来生成随机数。具体代码如下:本实例每次运行时结果都不相同,这就实现了随机产生数据的功能。该程序的运行结果如下:
生成的[0.1.0]区间的小数是:0.8773165855918825
生成的[0.7.0]区间的小数是:6.407083074782282
生成的[0.10]区间的整数是:5
生成的[-3.15]区间的整数是:4
生成一个随机长整型值:-8462847591661221914
生成一个随机布尔型值:false
生成一个随机浮点型值:0.6397003
下期七星彩开奖号码预测:0227168
使用ThreadLocalRandom的示例代码如下所示:
public class RandomTest {
public static void main(String[] args) {
ThreadLocalRandom random = ThreadLocalRandom.current();
for (int i = 0; i < 5; i++) {
System.out.println("第" + (i + 1) + "次获取的随机数为:" + random.nextInt());
}
}
}