本文共 3079 字,大约阅读时间需要 10 分钟。
Java 中如何生成指定范围内的随机数
作为一名开发者,我曾经在 Stack Overflow 上看到一个问题:“Java 中如何产生一个指定范围内的随机数”。这个问题看起来简单,但我当时感到意讶,因为它有 398 万的阅读量,难道仅仅是 Math.random() 的问题吗?于是,我决定深入研究这个问题,并通过实践找到最优解。
初次尝试:直接使用 Math.random()
我首先尝试使用 Math.random() 方法,试图在 2 到 11 的范围内生成随机数。代码如下:
public class GenerateMathRandomInteger { public static void main(String[] args) { int leftLimit = 2; int rightLimit = 11; Runnable r = () -> { int generatedInteger = leftLimit + (int) (Math.random() * rightLimit); System.out.println(generatedInteger); }; for (int i = 1; i < 10; i++) { new Thread(r).start(); } }} 运行结果却令人失望,输出的数字经常超出指定范围。显然,Math.random() 不可靠,我需要找到更可靠的方法。
第二次尝试:使用 Random 类
接下来,我尝试使用 Random 类,代码如下:
public class GenerateRandomInteger { public static void main(String[] args) { int leftLimit = 2; int rightLimit = 11; Random random = new Random(); int range = rightLimit - leftLimit; Runnable r = () -> { int generatedInteger = leftLimit + (int) (random.nextFloat() * range); System.out.println(generatedInteger); }; for (int i = 1; i < 10; i++) { new Thread(r).start(); } }} 这个方法似乎解决了问题,输出结果在 2 到 11 之间。但我依然不放心,于是我查阅了 Random 类的文档,发现 nextInt(int bound) 方法可以直接生成 0 到 bound 之间的随机整数。于是,我修改了代码如下:
public class GenerateRandomNextInt { public static void main(String[] args) { int leftLimit = 2; int rightLimit = 11; Random random = new Random(); Runnable r = () -> { int generatedInteger = leftLimit + random.nextInt(rightLimit - leftLimit + 1); System.out.println(generatedInteger); }; for (int i = 1; i < 10; i++) { new Thread(r).start(); } }} 结果再次符合预期,输出在指定范围内。
第三次尝试:使用 ThreadLocalRandom
为了更高效地在多线程环境下使用随机数生成,我尝试使用 ThreadLocalRandom 类。代码如下:
public class GenerateRandomThreadLocal { public static void main(String[] args) { int leftLimit = 2; int rightLimit = 11; Runnable r = () -> { int generatedInteger = ThreadLocalRandom.current().nextInt(leftLimit, rightLimit + 1); System.out.println(generatedInteger); }; for (int i = 1; i < 10; i++) { new Thread(r).start(); } }} ThreadLocalRandom 类基于本地线程提供随机数,避免了显式的随机数生成对象,提升了性能和效率。
第四次尝试:使用 Apache Commons Math
最后,我尝试使用 Apache Commons Math 库中的 RandomDataGenerator。代码如下:
import org.apache.commons.math3.RandomDataGenerator;
在需要生成随机数的位置使用:
public class RandomDataGeneratorDemo { public static void main(String[] args) { int leftLimit = 2; int rightLimit = 11; Runnable r = () -> { int generatedInteger = new RandomDataGenerator().nextInt(leftLimit, rightLimit); System.out.println(generatedInteger); }; for (int i = 1; i < 10; i++) { new Thread(r).start(); } }} 输出结果完全符合预期,显示了使用 Commons Math 库的优势。
总结
通过这几次尝试,我从最初的简单尝试到逐步优化,发现了不同方法的优缺点。最终,使用 ThreadLocalRandom 或 Commons Math 的 RandomDataGenerator 是更可靠和高效的选择。技术的选择取决于具体需求和项目的约束条件,关键是要理解每种方法的原理,并通过实践验证其适用性。
发表评论
最新留言
关于作者