Java中的随机数生成器

今天我们将看一下如何在Java中生成随机数。有时候我们需要在Java程序中生成随机数。例如,骰子游戏或者生成加密的随机密钥ID等。

Java中的随机数生成器

在Java中生成随机数有许多方法。

  1. java.util.Random类可用于创建随机数。它提供了几种方法来生成随机整数、长整数、双精度等。
  2. 我们还可以使用Math.random()来生成双精度数。该方法内部使用Java Random类。
  3. java.util.concurrent.ThreadLocalRandom类应该用于在多线程环境中生成随机数。这个类是Java Concurrent包的一部分,引入自Java 1.7。这个类有着类似Java Random类的方法。
  4. java.security.SecureRandom可用于生成具有强安全性的随机数。这个类提供了一个具有加密强度的随机数生成器。然而,它在处理上比较慢。因此,根据您的应用需求,您应该决定是否使用它。

Java随机数生成器

让我们来看一些在Java中生成随机数的例子。稍后,我们还将看看ThreadLocalRandom和SecureRandom示例程序。

1. 生成随机整数

Random random = new Random();

int rand = random.nextInt();

是的,生成java中的随机整数就是这么简单。当我们创建Random实例时,它会生成一个长种子值,该值在所有nextXXX方法调用中使用。我们可以在程序中设置这个种子值,但在大多数情况下,这不是必需的。

//使用Random构造函数设置长种子值
Random random = new Random(123456789);

//使用setter方法设置长种子值
Random random1 = new Random();
random1.setSeed(1234567890);

2. 在1到10之间生成Java随机数

有时我们必须在一个范围内生成随机数。例如,在骰子游戏中可能的值只能在1到6之间。下面是代码,展示了如何生成一个包含1到10的随机数。

Random random = new Random();
int rand = 0;
while (true){
    rand = random.nextInt(11);
    if(rand !=0) break;
}
System.out.println(rand);

参数 nextInt(int x) 中的参数被排除在外,因此我们必须提供参数为11。此外,生成的随机数中包括0,因此我们必须继续调用 nextInt 方法,直到获得介于1和10之间的值。您可以扩展上述代码以在任何给定范围内生成随机数。

3. 生成随机双精度数

我们可以使用 Math.random() 或 Random 类的 nextDouble 方法在 Java 中生成随机双精度数。

Random random = new Random();

double d = random.nextDouble();

double d1 = Math.random();

4. 生成随机浮点数

Random random = new Random();

float f = random.nextFloat();

5. 生成随机长整型数

Random random = new Random();

long l = random.nextLong();

6. 生成随机布尔值

Random random = new Random();

boolean flag = random.nextBoolean();

7. 生成随机字节数组

我们可以使用 Random 类生成随机字节并将其放入用户提供的字节数组中。生成的随机字节数量等于字节数组的长度。

Random random = new Random();

byte[] randomByteArray = new byte[5];

random.nextBytes(randomByteArray);

System.out.println(Arrays.toString(randomByteArray)); // sample output [-70, -57, 74, 99, -78]

8. 在多线程环境中使用 ThreadLocalRandom

以下是一个简单的示例,展示了在多线程环境中使用 ThreadLocalRandom 的用法。

package com.journaldev.randomnumber;

import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;

public class ThreadLocalRandomExample {

	public static void main(String[] args) {
		Runnable runnable = new MyRunnable();

		for (int i = 0; i < 5; i++) {
			Thread t = new Thread(runnable);
			t.setName("MyRunnable-Thread-" + i);
			t.start();
		}
	}

}

class MyRunnable implements Runnable {

	@Override
	public void run() {
		String threadName = Thread.currentThread().getName();
		System.out.println(threadName + "::" + ThreadLocalRandom.current().nextInt());
	}

}

以下是执行上述程序的示例输出。

MyRunnable-Thread-0::-1744088963
MyRunnable-Thread-3::139405798
MyRunnable-Thread-1::1403710182
MyRunnable-Thread-2::-1222080205
MyRunnable-Thread-4::-185825276

我们无法为 ThreadLocalRandom 实例设置种子值,否则会抛出 UnsupportedOperationException 异常。 ThreadLocalRandom 类还提供了一些额外的实用方法,用于在指定范围内生成随机数。例如,要生成一个介于 1 和 10 之间的随机数,我们可以这样做。

ThreadLocalRandom random = ThreadLocalRandom.current();
		
int rand = random.nextInt(1, 11);

ThreadLocalRandom 还具有类似的方法,用于生成随机的 long 和 double 值。

9. SecureRandom 示例

您可以使用SecureRandom类来使用所列出的任何提供程序生成更安全的随机数。下面是一个快速的SecureRandom示例代码。

Random random = new SecureRandom();

int rand = random.nextInt();

System.out.println(rand);

这就是关于在Java程序中生成随机数的全部内容。

您可以从我们的GitHub存储库下载示例代码。

Source:
https://www.digitalocean.com/community/tutorials/random-number-generator-java