Random()

Random类生成伪随机数流,Random类使用 48 位种子

Random的实例是线程安全的,但Random在并发中使用性能较差,可以在并发环境中使用ThreadLocalRandom

Random的实例在密码学上不是安全的,们可以使用SecureRandom来获得加密安全的伪随机数

Math.random()用于在更简单的用例中获取伪随机数

注意:使用Random只得到伪随机数而不是实际随机数。伪随机数是使用确定性过程生成的,它们在统计上近似是随机的

Random

Random有两种构造方法:

下面介绍Random的方法

上面三个方法均有三个可选参数:streamSizerandomNumberOriginrandomNumberBound

例如:random.doubles(5, 0, 10)表示返回 5 个范围在[0, 10)的随机数;注意:范围区间是「前闭后开」

再介绍一些其他方法

注意:

下面给出几个例子:

随机种子

先看一个例子:

输出结果:

不难发现生成的两组 10 个随机数都是一样的,这是因为我们使用了相同的随机种子

对于种子相同的Random对象,生成的随机数序列是一样的

在没带参数构造函数生成的 Random 对象的种子缺省是「当前系统时间的毫秒数」

所以在高并发下,每个用户线程生成随机数时,可能出现「系统时间的毫秒数」相同的情况

如果这个时候我们并没有自定义随机种子,极有可能出现多个用户生成的随机数相同的情况

具体可以看下面这个例子:

Math.random()

Math.random()返回[0.0, 1.0)正伪随机 double 值,和random.nextDouble();功能等价