Java中的随机数生成器

时间:2020-02-23 14:37:24  来源:igfitidea点击:

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

Java中的随机数生成器

有很多方法可以在Java中生成随机数。

  • java.util.Random类可用于创建随机数。
    它提供了几种生成随机整数,长整数,双精度整数等的方法。

  • 我们还可以使用Math.random()生成一个double。
    此方法在内部使用Java Random类。

  • 应该使用java.util.concurrent.ThreadLocalRandom类在多线程环境中生成随机数。
    此类是Java Concurrent包的一部分,并在Java 1.7中引入。
    该类具有与Java Random类类似的方法。

  • java.security.SecureRandom可用于生成具有强大安全性的随机数。
    此类提供了加密功能强的随机数生成器。
    但是,处理速度很慢。
    因此,根据您的应用程序要求,您应该决定是否使用它。

Java随机数生成器

让我们看一些用Java生成随机数的示例。
稍后,我们还将研究ThreadLocalRandom和SecureRandom示例程序。

1.生成随机整数

Random random = new Random();

int rand = random.nextInt();

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

//set the long seed value using Random constructor
Random random = new Random(123456789);

//set long seed value using setter method
Random random1 = new Random();
random1.setSeed(1234567890);

2. Java随机数介于1到10之间

有时我们必须在一个范围之间生成一个随机数。
例如,在骰子游戏中,可能的值只能在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和2之间的值。
10.您可以扩展以上代码以生成任意给定范围内的随机数。

3.生成随机双

我们可以使用Math.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.theitroad.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);