Java随机数

Java的Random类用于生成一系列随机数。

Java Random类

  • Random类是java.util包的一部分。
  • Java Random类的实例用于生成随机数。
  • 该类提供了多种方法以生成整数、双精度、长整型、浮点数等类型的随机数。
  • 随机数生成算法基于种子值。如果未提供种子值,则从系统纳秒时间创建种子值。
  • 如果两个Random实例具有相同的种子值,则它们将生成相同序列的随机数。
  • Java的Random类是线程安全的,但在多线程环境中建议使用java.util.concurrent.ThreadLocalRandom类。
  • Random类的实例不适用于对安全性要求较高的应用程序,在这些情况下最好使用java.security.SecureRandom

Java Random构造函数

Java Random类有两个构造函数,如下:

  1. Random():创建新的随机生成器
  2. Random(long seed):使用指定的种子创建新的随机生成器

Java Random类方法

让我们来看一下Java Random类的一些方法。

  1. nextBoolean():此方法返回随机数生成器序列中的下一个伪随机布尔值。
  2. nextDouble():此方法返回介于0.0和1.0之间的下一个伪随机双精度值。
  3. nextFloat():此方法返回介于0.0和1.0之间的下一个伪随机浮点值。
  4. nextInt():此方法从随机数生成器序列中返回下一个整数值。
  5. nextInt(int n):此方法返回一个介于0和指定值之间的伪随机整数值。

Java Random示例

让我们来看下面的Java Random示例程序。

package com.journaldev.examples;

import java.util.Random;

/**
 * Java Random Number Example Program
 * 
 */
public class RandomNumberExample {

	public static void main(String[] args) {
		
		//初始化随机数生成器
		Random random = new Random();
		
		//生成布尔值
		System.out.println(random.nextBoolean());
		
		//生成双精度值
		System.out.println(random.nextDouble());
		
		//生成浮点值
		System.out.println(random.nextFloat());
		
		//生成整数值
		System.out.println(random.nextInt());
		
		//生成整数值 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.journaldev.examples;

import java.util.Random;

/**
 * Java Random Number Using Seed Example Program
 * 
 * @author pankaj
 *
 */
public class RadomSeedExample {

	public static void main(String[] args) {
		
		//使用构造函数
		Random random = new Random(100);
		System.out.println("Using Constructor");
		System.out.println(random.nextInt());
		
		//使用方法
		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.journaldev.examples;

import java.util.Random;

/**
 * Java Random Number Using Same Seed Example Program
 * 
 */
public class RandomNumberSameSeedExample {

	public static void main(String[] args) {
		
		//使用相同的种子初始化两个随机数生成器
		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.journaldev.random;

import java.util.Random;
import java.util.stream.IntStream;

public class JavaRandomExample {

	public static void main(String[] args) {

		Random random = new Random();

		// 生成介于 1 到 100 之间的 5 个整数流
		IntStream ints = random.ints(5, 1, 100);

		ints.forEach(System.out::println);
	}

}

这就是关于 Java Random 类的简要概述。 参考:API 文档

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