Java随机

时间:2020-02-23 14:36:46  来源:igfitidea点击:

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

Java随机类

  • 随机类是java.util包的一部分。

  • java Random类的一个实例用于生成随机数。

  • 此类提供了几种生成整数,双精度,长整型,浮点型等随机数的方法。

  • 随机数生成算法对种子值起作用。
    如果未提供,则从系统纳米时间创建种子值。

  • 如果两个随机实例具有相同的种子值,则它们将生成相同的随机数序列。

  • Java Random类是线程安全的,但是在多线程环境中,建议使用java.util.concurrent.ThreadLocalRandom类。

  • 随机类实例不适合对安全敏感的应用程序,在这种情况下最好使用java.security.SecureRandom

Java随机构造函数

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

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

Java随机类方法

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

  • nextBoolean():该方法返回下一个伪随机数,它是来自随机数生成器序列的布尔值。

  • nextDouble():该方法返回下一个伪随机数,它是介于0.0和1.0之间的双精度值。

  • nextFloat():该方法返回下一个伪随机数,该伪随机数是介于0.0和1.0之间的float值。

  • nextInt():此方法从随机数生成器序列返回下一个int值。

  • nextInt(int n):此方法返回一个伪随机数,它是介于0和随机数生成器序列中指定值之间的int值。

Java随机示例

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

package com.theitroad.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 Radom Number Generation的更多信息。

使用种子生成随机数

我们可以通过两种方式使用种子生成随机数。

Random random = new Random(long seed);
                       
Random random1 = new Random();
random1.setSeed(seed);

种子是通过方法next(int)维护的伪随机数生成器内部状态的初始值。

package com.theitroad.examples;

import java.util.Random;

/**
 * Java Random Number Using Seed Example Program
 * 
 * @author hyman
 *
 */
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.theitroad.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.theitroad.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);
	}

}