我有一段代码会生成一些随机数并在控制台上打印出来。但是我对它所打印的图案感到好奇,例如,
import java.util.*; public class Test { public static void main(String[] args) { Random random = new Random(-6732303926L); for(int i=0;i<10;i++) System.out.println(random.nextInt(10)+" "); } }
结果:0 1 2 3 4 5 6 7 8 9- 新行中的每个数字。
如果您稍微更改此代码!喜欢,
import java.util.*; public class Test { public static void main(String[] args) { Random random = new Random(-6732303926L); for(int i=0;i<10;i++) System.out.println(random.nextInt(11)+" "); } }
结果:8 9 2 2 10 10 8 8 0 0- 换行中的每个数字。
根本不是随机的0123456789是什么原因呢?
产生序列的原因是,通过使用其下一种方法,使Random可预测具有可预测和可重复的序列,可以测试软件。每当特定的长种子参数是Random构造函数的参数时,实例化的Random对象都应该通过其next方法返回相同的值序列。这是java.util.Random的故意功能。
java.util.Random有两个构造函数:
Random()
和
Random(long seed)
没有长整数种子的构造函数使用系统时间为伪随机数生成器创建种子值。没有两个Random实例化将使用相同的种子,并且您应该获得一个非常好的伪随机序列。使用不带种子的构造函数的随机实例化将创建一个实例,该实例具有不可预测的值序列,这些值将是伪随机的。
具有种子值的构造函数仅用于使用其下一种方法使具有可预测序列的Random确定性。种子的典型用途是用于软件测试,其中结果必须是可预测的和可重复的。每个使用相同长种子整数的Random实例每次都会创建相同的结果序列。当使用nextInt(10)方法获取10个整数值之一时,使用的特定长度会使该序列一次又一次成为0 1 2 3 4 5 6 7 8 9。每次执行软件时可重复的此可预测序列和其他可预测序列对于测试软件非常有用,而不是用于创建不可预测的伪随机序列。