Random类
首先java的Random采用48位的种子用linear congruential formula方法实现了一个生成随机数的类。
构造函数
Random类有两个构造函数。
一个是无参的,一个是以long为参数的。
这个long就是生成随机数的种子,当然这里需要区别一下,种子和生成随机数的范围为无关。
种子的意义
简单的说java生成的随机数实际上是伪随机数,也就是一个很大周期的循环,如果两个种子一样的话实际上相当于这两个循环是相同的。
可以人工的定义这个种子实际上是为了保障这一特性。使得相同种子生产的序列是相同的,此外需要额外注意的是这个参数long只用到低位的48位。如果需要用到所有64位数需要自己继承并修改构造函数。
当然调用setSeed可以改变种子。
生成随机数的常用方法
首先这个类有一个protect的next方法,所有的生成下一个随机数都是调用这个类的。
java设计的很合理,可以生成的随机数有boolean、bytes、double、float、gaussian(double类型的)、Int、long。
当然这里面除了int和boolean都是从0到1之间的。int是这个int范围的,boolean当然是false和true。
生成固定范围的int
nextInt提供了一种可以指定范围的的参数(int n),生成从0到n的之间的随机数
可替代的方案
当然有时候使用Math.random()静态方法或许是更好的一种方案。他会生成一个0到1之间的double数。
这个方法也是线程安全的,但是如果太频繁的竞争会导致
使用的其他注意事项
首先Document说Random是线程安全的类,但是同时使用Random会导致冲突和性能下降。
所有如果需要多线程大量的高频率的产生随机数,请使用ThreadLocalRandom,这个的源码有时间可以看看。
Random没有安全加密,如果有特殊的安全需要请使用SecureRandom。
这两个也是Random的子类。
继承Random
首先需要注意的是Random如果需要自己实现。
需要覆盖next方法。
并且实现Serializable。