Random
Random的本质就是根据设置的种子,执行一个固定的算法得到结果,这就意味着如果多个实例种子一样且调用顺序一致时返回的是同样的结果。默认的种子是System.currentTimeMillis()。线程安全,在多线程下性能较差。
public class RandomDemo {
public static void main(String[] args) {
// 线程安全,在多线程下性能较差
Random random1 = new Random(2); // 不设置种子时,种子默认为System.currentTimeMillis(),不会导致以下返回同样结果的问题
Random random2 = new Random(2);
Random random3 = new Random(2);
System.out.println(random1.nextBoolean()); //true
System.out.println(random1.nextLong()); // 5411842376618821008
System.out.println(random2.nextLong()); // -4959463499243013640
System.out.println(random3.nextLong()); // -4959463499243013640 种子一样且调用顺序一致时返回的是同样的结果
}
}
ThreadLocalRandom
ThreadLocalRandom继承自Random。线程安全,在多线程下具有较好的性能,无法设置种子,所以也不会出现种子一致且调用顺序一致时传出现的随机数一致的情况
// 线程安全,在多线程下具有较好的性能,没法设置种子,所以也不会出现种子一致且调用顺序一致时传出现的随机数一致的情况
System.out.println(ThreadLocalRandom.current().nextLong());// 191403865608614265
System.out.println(ThreadLocalRandom.current().nextLong());// 7511566053367412453
System.out.println(ThreadLocalRandom.current().nextLong());// 4667700042531046115
SecureRandom
SecureRandom类收集了一些操作系统的随机事件,比如鼠标点击,键盘点击等等,SecureRandom 使用这些随机事件作为种子。这意味着,种子是不可预测的,一种相对安全的随机数生成器。用来生成密钥之类的安全性较高的随机数。而不像Random默认使用系统当前时间的毫秒数作为种子或者,有规律可寻。
try {
System.out.println(SecureRandom.getInstance("SHA1PRNG").nextLong()); // -6093059711289970526
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
Math.random()
返回0.0和1.0之间的double,其底层其实就是Random.nextDouble()。
// 返回0.0和1.0之间的double
System.out.println(Math.random()); // 0.37397664389057095