Java Random

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