恕我直言,我怀疑你并不会生成随机数
发布日期:2021-04-30 21:09:55 浏览次数:97 分类:精选文章

本文共 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 是更可靠和高效的选择。技术的选择取决于具体需求和项目的约束条件,关键是要理解每种方法的原理,并通过实践验证其适用性。

上一篇:高效编程之原则
下一篇:LVS负载均衡群集(NAT模式)部署实验

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2026年06月03日 19时07分45秒