java 获得随机数的几种方法
方法一:java.util.Random
1.1:创建方法 new Random(); 或 new Random(long seed); 两种方法。默认构造函数其实也使用了系统时间与唯一生成器经过异或后得到的值。具体构造函数如下:
public Random() {
this(seedUniquifier() ^ System.nanoTime());
}
1.2:得到一定范围的随机数 new Random.nextInt(int bound), 得到一个(0,bound)之间的整数
1.3:Random类为线程安全,但JDK建议我们在多线程里面使用 java.util.concurrent.ThreadLocalRandom。原话如下:Instances of {@code java.util.Random} are threadsafe. However, the concurrent use of the same {@code java.util.Random} instance across threads may encounter contention and consequent poor performance. Consider instead using {@link java.util.concurrent.ThreadLocalRandom} in multithreaded designs.
方法二:java.util.concurrent.ThreadLocalRandom
2.1:创建方法: ThreadLocalRandom.current()
2.1:得到随机数 : ThreadLocalRandom.current().nextInt() 等,也可以指定范围,如 nextInt(int bound) 得到(0,bound)之间的随机整数; nextInt(int origin, int bound) 得到(origin,bound)之间的整数。JDK建议多线程里面使用该类。
方法三:java.lang.Math.random()方法
3.1:使用方法: Math.random(); 返回(0,1)之间的double指。实际上Math.random()方法就是由java.util.Random类实现。具体源码如下:
public static double random() {
return RandomNumberGeneratorHolder.randomNumberGenerator.nextDouble();
}
private static final class RandomNumberGeneratorHolder {
static final Random randomNumberGenerator = new Random();
}
方法四:java.security.SecureRandom
4.1:创建方法:3种方法:new SecureRandom(); , 或者指定种子创建对象:new SecureRandom(byte seed[]); 再或者通过静态方法:SecureRandom.getInstance(String algorithm)创建对象。
4.2:该类使用确定的算法(如SHA1PRNG) 根据实际的随机种子生成伪随机序列。
其四者关系如下图: