📅  最后修改于: 2023-12-03 15:02:05.610000             🧑  作者: Mango
在Java编程中,我们经常需要生成随机数。Java提供了两个类可以用来生成随机数,分别是java.util.Random
类和java.util.concurrent.ThreadLocalRandom
类。
java.util.Random
类是Java中用来生成伪随机数的类。该类的用法非常简单,只需要创建该类的实例即可调用其nextInt()
、nextDouble()
等方法来生成随机数。
import java.util.Random;
public class RandomDemo {
public static void main(String[] args) {
Random random = new Random();
// 生成一个随机的int类型整数
int randomNum = random.nextInt();
System.out.println("随机数为:" + randomNum);
// 生成一个0-10之间的随机整数
int randomNum10 = random.nextInt(11);
System.out.println("0-10之间的随机数为:" + randomNum10);
// 生成一个0-1之间的随机小数
double randomDouble = random.nextDouble();
System.out.println("0-1之间的随机小数为:" + randomDouble);
}
}
输出结果:
随机数为:2078353365
0-10之间的随机数为:3
0-1之间的随机小数为:0.6976341274913611
java.util.concurrent.ThreadLocalRandom
类是Java 7中新增的一个类,它是Random
类的改进版,具有更好的性能和更高的并发性。相比于Random
类,ThreadLocalRandom
类中的方法没有synchronized
关键字,因此可以更快地生成随机数。
import java.util.concurrent.ThreadLocalRandom;
public class ThreadLocalRandomDemo {
public static void main(String[] args) {
// 生成一个随机的int类型整数
int randomNum = ThreadLocalRandom.current().nextInt();
System.out.println("随机数为:" + randomNum);
// 生成一个0-10之间的随机整数
int randomNum10 = ThreadLocalRandom.current().nextInt(11);
System.out.println("0-10之间的随机数为:" + randomNum10);
// 生成一个0-1之间的随机小数
double randomDouble = ThreadLocalRandom.current().nextDouble();
System.out.println("0-1之间的随机小数为:" + randomDouble);
}
}
输出结果:
随机数为:-1910071015
0-10之间的随机数为:8
0-1之间的随机小数为:0.3830904825164474
为了比较Random
类和ThreadLocalRandom
类的性能,我们可以编写如下的测试代码:
import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;
public class RandomPerformanceTest {
public static void main(String[] args) {
int n = 10000000;
int[] randomNums1 = new int[n];
int[] randomNums2 = new int[n];
Random random = new Random();
long start1 = System.currentTimeMillis();
for (int i = 0; i < n; i++) {
randomNums1[i] = random.nextInt();
}
long end1 = System.currentTimeMillis();
System.out.println("Random耗时:" + (end1 - start1) + "毫秒");
ThreadLocalRandom threadLocalRandom = ThreadLocalRandom.current();
long start2 = System.currentTimeMillis();
for (int i = 0; i < n; i++) {
randomNums2[i] = threadLocalRandom.nextInt();
}
long end2 = System.currentTimeMillis();
System.out.println("ThreadLocalRandom耗时:" + (end2 - start2) + "毫秒");
}
}
在我的机器上运行,输出结果如下:
Random耗时:819毫秒
ThreadLocalRandom耗时:316毫秒
可以看出,ThreadLocalRandom
类比Random
类性能更好。
Java
的Random
类和ThreadLocalRandom
类都可以用来生成随机数,但是ThreadLocalRandom
类具有更好的性能和更高的并发性。因此在多线程环境下,我们应该优先使用ThreadLocalRandom
类来生成随机数。