阅读时间: 3分钟
首先,在这里介绍的Random是指java.util.Random。
而在Java中有不少class和method都是继承至 java.util.Random,例如: ThreadLocalRandom, Math.random() 等等。
Random
java.util.Random中生成的随机数是基于它的种子(seed),种子(在JDK 1.5之后)选用了System.nanoTime(),它是从某个不确定的时间起(可以是过去/现在/未来),到当下的时间差,精确到纳秒,它的主要用途是衡量一个时间段,例如运行一段代码/一个指令,所执行的时间。
而产生seed的值是运用了线性同余法伪随机数生成器linear congruential pseudorandom number generator (LGC)。这个算法最后得出的是伪随机数。
因此,从输出中可以很容易计算出种子值。
SecureRandom
SecureRandom也是继承至 java.util.Random。
但SecureRandom 使用种子不是以时间作标準,而是以一些随机事件作为标準,例如滑鼠点选、键盘点选等等。
此外,SecureRandom使用加密的强随机数生成器 (RNG)来产生最终的seed值,以确保不能从输出中的资料计算出种子值。