Java中的随机数生成器
今天,我们将研究如何在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);