Java随机数Random类
java.util.Random
该类的实例用于生成伪随机数的流。 该类使用48位种子,其使用线性同余公式进行修改。如果使用相同的种子创建两个Random Random
,并且对每个实例进行相同的方法调用序列,则它们将生成并返回相同的数字序列。 为了保证此属性,为Random类Random
。 为了Java代码的绝对可移植性,Java实现必须使用这里所示的所有算法为Random
类。 然而,Random类的子类Random
使用其他算法,只要它们遵守所有方法的一般合同。
Random类实现的Random
使用protected
实用程序方法,每次调用可以提供多达32个伪随机生成位。
许多应用程序会发现方法Math.random()
使用起来更简单。
java.util.Random的java.util.Random
是线程安全的。 但是,跨线程的同时使用java.util.Random
实例可能会遇到争用,从而导致性能下降。 在多线程设计中考虑使用ThreadLocalRandom
。
java.util.Random的java.util.Random
不是加密安全的。 考虑使用SecureRandom
获取一个加密安全的伪随机数生成器,供安全敏感应用程序使用。
构造方法:
public Random()
创建一个新的随机数生成器。 该构造函数将随机数生成器的种子设置为非常可能与该构造函数的任何其他调用不同的值。
public Random(long seed)
使用单个long种子创建新的随机数生成器。 种子是通过方法next(int)维护的伪随机数发生器的内部状态的初始值。
调用new Random(seed)相当于:
Random rnd = new Random();
rnd.setSeed(seed); //seed - 初始种子
方法:
public void nextBytes(byte[] bytes)
//生成随机字节并将它们放入用户提供的字节数组中。 产生的随机字节数等于字节数组的长度。
//异常:NullPointerException - 如果字节数组为空
public int nextInt()
//返回下一个伪随机数,从这个随机数生成器的序列中均匀分布int值。 nextInt的一般合同是一个int值被伪随机生成并返回。 所有2^32可能的int值以(大约)相等的概率产生。
public int nextInt(int bound)
//返回一个伪随机数,它是取自此随机数生成器序列的、在 0(包括)和指定值n(不包括)之间均匀分布的 int 值。
public long nextLong()
//返回下一个伪随机数,从这个随机数发生器的序列中均匀分布long值。 nextLong的一般合同是一个long值被伪随机生成并返回。
public boolean nextBoolean()
//返回下一个伪随机数,从这个随机数发生器的序列中均匀分布boolean值。 nextBoolean的一般合同是一个boolean值被伪随机生成并返回。 价值true和false以(大概)相等的概率产生。
public float nextFloat()
//返回下一个伪随机数,均匀分布float之间的值0.0和1.0从这个随机数生成器的序列。
public double nextDouble()
//返回下一个伪随机数,从该随机数发生器的序列中0.0和1.0之间的double值。
public double nextGaussian()
//从该随机数发生器的序列返回下一个伪随机数,高斯(“正”)分布的double值,平均值为0.0 ,标准差为1.0 。
public IntStream ints(long streamSize)
//返回一个流,产生给定的streamSize数量的伪int数int值。 伪随机int值被生成,就像调用方法nextInt()的结果一样 。
public void setSeed(long seed):
//使用单个 long 种子设置此随机数生成器的种子。
代码示例:
import java.util.Random;
public class Test {
public static void main(String[] args){
Random random = new Random();
//nextBytes(byte)
byte[] a = new byte[3];
random.nextBytes(a);
System.out.println(a[0]+","+a[1]+","+a[2]);
//nextInt()
System.out.println("");
for(int i=0;i<3;i++){
int b=random.nextInt();
System.out.println(b);
}
//nextInt(int)
System.out.println("");
for(int i=0;i<3;i++){
int b=random.nextInt(10);
System.out.print(b+" ");
}
//nextLong()
System.out.println("");
for(int i=0;i<3;i++){
Long b=random.nextLong();
System.out.println(b);
}
//nextBoolean()
System.out.println("");
for(int i=0;i<3;i++){
boolean b=random.nextBoolean();
System.out.println(b);
}
//nextFloat()
System.out.println("");
for(int i=0;i<3;i++){
Float b=random.nextFloat();
System.out.println(b);
}
//nextDouble()
System.out.println("");
for(int i=0;i<3;i++){
double b=random.nextDouble();
System.out.println(b);
}
//nextGaussian
System.out.println("");
for(int i=0;i<3;i++){
double b=random.nextGaussian();
System.out.println(b);
}
}
}
运行结果: