Random
java.lang.Object
java.util.Random
java.security.SecureRandom
java.util.concurrent.ThreadLocalRandom
2
3
4
java.util.Random
An instance of this class is used to generate a stream of pseudorandom numbers.
java.security.SecureRandom
This class provides a cryptographically strong random number generator (RNG).
java.util.concurrent.ThreadLocalRandom
A random number generator isolated to the current thread.
Random
具有两个构造器:
Random()
Random(long seed)
# 种子(seed)?
seed 即生成伪随机数算法的初始值。算法根据这个初始值来生成伪随机数。
A random seed (or seed state, or just seed) is a number (or vector) used to initialize a pseudorandom number generator.
https://en.wikipedia.org/wiki/Random_seed
# 不便之处(Random类无可指定范围的方法)
由于 Random
类不具有生成指定范围随机数的方法(除了一个nextInt(int bound)
可生成从0
到bound
范围的随机数),这就有点不太方便了。
# Math.random()
乘法方式
int max = 100;
int min = 0;
2
指定范围的随机浮点数:
double randomDouble = (Math.random() * ((max - min) + 1)) + min;
指定范围的随机整数:
int randomInt = (int) (Math.random() * ((max - min) + 1)) + min;
# ThreadLocalRandom
方式
java.util.concurrent.ThreadLocalRandom
为 java.util.Random
子类。该类具有可指定范围的生成随机数方法。
nextDouble(double bound)
范围从0
到bound
nextDouble(double origin, double bound)
范围从origin
到bound
nextInt(int bound)
范围从0
到bound
nextInt(int origin, double bound)
范围从origin
到bound
- ...
double randomDouble = ThreadLocalRandom.current().nextDouble(0.9, 1.5);
int randomLong = ThreadLocalRandom.current().nextLong(500000000000, 1000000000000);
2
3
注意
ThreadLocalRandom
是为线程而生的,所以要使用它的方法也就要遵从它的方式。该类的方法均通过它的一个静态方法current()
来调用。
有意思的是,在IDE里面点到
nextDouble(Double origin, Double bound)
的源码会发现算法和上面的Math.random()
乘法方式是一样的。所以