如何在 Java 中生成随机数?

2025年3月17日 | 阅读 8 分钟

Java编程中,我们在开发应用程序时经常需要生成随机数。许多应用程序都有随机生成数字的功能,例如,许多应用程序使用OTP来验证用户。随机数最好的例子是骰子。因为当我们掷骰子时,我们会得到一个介于 1 到 6 之间的随机数。

在本节中,我们将学习什么是随机数以及如何在Java中生成随机数

Java编程中,为各种应用程序生成随机数是一个常见的需求。无论是用于创建安全的密码、实现游戏机制,还是生成一次性密码(OTP)。Java 提供了多种方法和类来处理随机数生成。在本节中,我们将讨论随机数的概念、生成随机数的不同方法以及说明每种方法的示例。

随机数

在编程的上下文中,随机数是使用数学算法从大量数字集中选择的值。随机数的关键特征包括:

均匀分布:生成的数值在某个确定区间内均匀分布。

不可预测性:无法根据当前或过去的值预测下一个值。

现在,让我们深入了解 Java 为生成随机数提供的各种方法和类。

在 Java 中生成随机数

在 Java 中,有以下几种生成随机数的方法:

  • 使用 Math.random() 方法
  • 使用 Random
  • 使用 RandomSeedGenerator 类(Java 17)
  • 使用 ThreadLocalRandom
  • 使用 ints() 方法(Java 8 中)

使用 Math.random() 方法

Java 的 Math 类有许多用于不同数学运算的方法。其中之一是 random() 方法。它是 Math 类的静态方法。我们可以直接调用它。它只生成大于等于 0.0小于 1.0double 类型随机数。在使用 random() 方法之前,我们必须导入 java.lang.Math 类。

语法

它不接受任何参数。它返回一个伪随机双精度数,该数大于等于 0.0 且小于 1.0。

让我们创建一个使用 random() 方法生成随机数的程序。

RandomNumberExample1.java

输出

1st Random Number: 0.17434160924512265
2nd Random Number: 0.4297410090709448
3rd Random Number: 0.4828656381344487
4th Random Number: 0.13267917059488898

请记住:每次执行程序时,我们都会得到不同的输出。您的输出可能与上面显示的输出不同。

如果我们要生成指定范围内的随机数,也可以使用以下公式。

在上述公式中,min 值是包含的,而 max 值是不包含的。

让我们创建一个在 200 到 400 之间生成随机数的程序。

RandomNumberExample2.java

输出 1

Random value of type double between 200 to 400:
233.88329802655377
Random value of type int between 200 to 400:
329

输出 2

Random value of type double between 200 to 400:
254.8419979875385
Random value of type int between 200 to 400:
284

使用 Random 类

生成随机数的另一种方法是使用 Java Random,它位于 java.util 包中。它生成一个伪随机数流。我们可以生成任何数据类型的随机数,例如整数、浮点数、双精度数、布尔值、长整型。如果您打算使用此类生成随机数,请按照以下步骤操作:

  1. 首先,导入类 java.lang.Random。
  2. 创建 Random 类的对象
  3. 调用以下任何一种方法:
    • nextInt(int bound)
    • nextInt()
    • nextFloat()
    • nextDouble()
    • nextLong()
    • nextBoolean()

以上所有方法都从该随机数生成器的序列返回下一个伪随机、均匀分布的值(相应的方法)。nextDouble()nextFloat() 方法生成 0.0 到 1.0 之间的随机值。

nextInt(int bound) 方法接受一个参数 bound(上界),该参数必须为正数。它在 0 到 bound-1 的范围内生成一个随机数。

让我们创建一个使用 Random 类生成随机数的程序。

RandomNumberExample3.java

输出

Randomly Generated Integers Values
23
767
Randomly Generated Double Values
0.37823814494212016
0.998058172671956
Randomly Generated Float Values
0.87804186
0.93880254
Randomly Generated Long Values
-4974823544291679198
3650240138416076693
Randomly Generated Boolean Values
false
true

使用 ThreadLocalRandom 类

ThreadLocalRandom 类定义在 java.util.concurrent 包中。它使用内部生成的种子进行初始化,该种子与 Math 类的随机生成器相同。它不能被修改。我们可以按以下方式使用此类:

其中 X 可能是 Int、Long、Float、double 等。

注意:不可能意外地与多个线程共享 ThreadLocalRandom。

我们可以生成任何数据类型的随机数,例如整数、浮点数、双精度数、布尔值、长整型。如果您打算使用此类生成随机数,请按照以下步骤操作:

  • 首先,通过使用 java.util.concurrent.ThreadLocalRandom 导入类。
  • 调用您想要随机生成数字的相应方法。
  • nextInt()
  • nextDouble()
  • nextLong()
  • nextFloat()
  • nextBoolean()

以上所有方法都覆盖了 Random 类的相应方法,并返回相应的值。

  • nextInt(int bound)
  • nextDouble(int bound)
  • nextLong(int bound)

以上方法解析一个参数 bound(上界),该参数必须为正数。它返回 0(包含)和指定 bound(不包含)之间的相应随机生成值。如果 bound 为负数,则抛出 IllegalArgumentExcetion

  • nextInt(int origin, int bound)
  • nextDouble(int origin, int bound)
  • nextLong(int origin, int bound)

以上方法解析两个参数 originbound。origin 指定返回的最小值,bound 指定上界。它在指定的 origin(包含)和 bound(不包含)之间返回相应的随机生成值。另外,如果 origin 大于或等于 bound,则抛出 IllegalArgumentExcetion

让我们创建一个使用 ThreadLocalRandom 类生成随机数的程序。

RandomNumberExample4.java

输出 1

Randomly Generated Integer Values:
348534891
-1887936727
Randomly Generated Double Values:
0.15644440033119833
0.5242730752133399
Randomly Generated Boolean Values:
true
true

输出 2

Output 2:
Randomly Generated Integer Values:
402755574
295398333
Randomly Generated Double Values:
0.4856461791062565
0.5148677091077654
Randomly Generated Boolean Values:
false
true

同样,我们也可以使用 ThreadLocalRandom 类的其他方法。

使用 RandomSeedGenerator 类(Java 17)

从 Java 17 开始,java.util 包中引入了一个新类 RandomSeedGenerator。它提供了一种标准化的方法来生成用于初始化随机数生成器的随机种子。

以下是使用 RandomSeedGenerator 的简短示例。

RandomSeedGeneratorExample.java

输出

Random Seed: [-109, 38, -64, -51, -49, -95, -90, -2, -17, 50, 13, 36, 48, 19, 35, 82]

这些新增功能增强了 Java 中随机数生成的覆盖范围,解决了安全问题以及 Java 17 中引入的最新功能。

Java 8 中的随机数生成

在 Java 8 中,Java Random 类中添加了一个新方法 ints()。在使用该方法之前,我们必须导入 java.util.Random 类。

ints()

生成的伪随机 int 值与调用 nextInt() 方法相同。它返回一个无限的伪随机 int 值流。

ints(long streamSize)

该方法解析一个 long 类型的参数 streamSize。它指定要生成的数值数量。生成的伪随机 int 值与调用 nextInt() 方法相同。它还返回一个随机生成的 int 值流。如果 stream size 小于零,则抛出 IllegalArgumentException

参数

streamSize:要生成的数值数量。

randomNumberOrigin:每个随机值的起点。

randomNumberBound:每个随机值的终点。

它返回具有指定起点和终点的伪随机 int 值流。如果

  • stramSize < 0
  • origin > = bound

参数

randomNumberOrigin:每个随机值的起点。

randomNumberBound:每个随机值的终点。

它返回具有指定起点和终点的无限伪随机 int 值流。如果起点大于或等于终点,则抛出 IllegalArgumentException

类似地,我们也可以通过使用 longs()doubles() 方法分别生成 long 和 double 类型的流。

让我们创建一个使用 Random 类的 ints() 方法生成整数流的程序。

RandomNumberExample5.java

输出 1

727900357
-1073118456
306279822
370327182
1366265119
65
75
75
88
76
75
56
86
85

输出 2

-1338107947
-1698771421
594232770
-1224937976
-1625069815
56
69
67
87
64
52
72
75
76

下一个主题Java 教程