Java随机数生成器
Java的Random类用于生成一系列随机数字。
Java的Random类
- Random class is part of java.util package.
- An instance of java Random class is used to generate random numbers.
- This class provides several methods to generate random numbers of type integer, double, long, float etc.
- Random number generation algorithm works on the seed value. If not provided, seed value is created from system nano time.
- If two Random instances have same seed value, then they will generate same sequence of random numbers.
- Java Random class is thread-safe, however in multithreaded environment it’s advised to use java.util.concurrent.ThreadLocalRandom class.
- Random class instances are not suitable for security sensitive applications, better to use java.security.SecureRandom in those cases.

Java随机构造函数
Java的Random类有两个构造方法,如下所示:
- Random() :创建一个新的随机生成器。
Random(long seed) :使用指定的种子创建一个新的随机生成器。
Java Random类的方法
让我们来看看Java Random类的一些方法。
- nextBoolean(): 这个方法返回随机数生成器序列中的下一个伪随机布尔值。
nextDouble(): 这个方法返回0.0和1.0之间的下一个伪随机双精度值。
nextFloat(): 这个方法返回0.0和1.0之间的下一个伪随机单精度值。
nextInt(): 这个方法返回随机数生成器序列中的下一个整数值。
nextInt(int n): 这个方法返回随机数生成器序列中从0到指定值之间的下一个伪随机整数值。
Java随机示例
让我们来看一下下面的Java随机数示例程序。
package com.Olivia.examples;
import java.util.Random;
/**
* Java Random Number Example Program
*
*/
public class RandomNumberExample {
public static void main(String[] args) {
//initialize random number generator
Random random = new Random();
//generates boolean value
System.out.println(random.nextBoolean());
//generates double value
System.out.println(random.nextDouble());
//generates float value
System.out.println(random.nextFloat());
//generates int value
System.out.println(random.nextInt());
//generates int value within specific limit
System.out.println(random.nextInt(20));
}
}
以上程序的输出是:
false
0.30986869120562854
0.6210066
-1348425743
18
请查看此帖子获取有关Java随机数生成的更多信息。
使用种子生成随机数
我们可以用两种方法使用种子生成随机数。
Random random = new Random(long seed);
Random random1 = new Random();
random1.setSeed(seed);
种子是由next(int)方法维护的伪随机数生成器的内部状态的初始值。
package com.Olivia.examples;
import java.util.Random;
/**
* Java Random Number Using Seed Example Program
*
* @author scdev
*
*/
public class RadomSeedExample {
public static void main(String[] args) {
//using constructor
Random random = new Random(100);
System.out.println("Using Constructor");
System.out.println(random.nextInt());
//using method
Random random2 = new Random();
random2.setSeed(200);
System.out.println("Using Method");
System.out.println(random2.nextInt());
}
}
上述程序的输出为:
Using Constructor
-1193959466
Using Method
-1133938638
如果我们给两个不同的随机数生成器传递相同的种子,会发生什么呢?让我们看一下下面的程序,看看如果我们给两个不同的随机数生成器传递相同的种子会发生什么。
package com.Olivia.examples;
import java.util.Random;
/**
* Java Random Number Using Same Seed Example Program
*
*/
public class RandomNumberSameSeedExample {
public static void main(String[] args) {
//initialize two random number generators using same seed
Random random1 = new Random(100);
Random random2 = new Random(100);
System.out.println(random1.nextInt());
System.out.println(random2.nextInt());
}
}
以上程序的输出为:
-1193959466
-1193959466
我们可以看到,如果我们将相同的种子传递给两个不同的随机数生成器,它们将生成相同的随机数。
Java 8 随机类方法
从上面的图片可以看出,在Java 8中Random类中添加了许多新方法。这些方法可以产生一串随机数。下面是一个简单的程序,用于生成1到100之间的5个整数流。
package com.Olivia.random;
import java.util.Random;
import java.util.stream.IntStream;
public class JavaRandomExample {
public static void main(String[] args) {
Random random = new Random();
// generate stream of 5 ints between 1 to 100
IntStream ints = random.ints(5, 1, 100);
ints.forEach(System.out::println);
}
}
