Random类和System.random() 区别
1、Random继承实现关系
class Random extends Object implements Serializable
直接子类:
SecureRandom: 因为Random不是加密安全的
ThreadLocalRandom:因为Random不是线程安全的
2、Random使用
我们先看看Random两种构造方法的使用得到的结果,发现有参构造得到的三组随机数竟然是相同的!!而空参构造得到的三组随机数不相同,至于为什么我们贴出源码探究。
public class TestRandom {
public static void main(String[] args) {
//生成三个随机数生成器
for (int i = 0; i < 3; i++) {
Random random = new Random();//空参构造
//每个生成器生成三个随机数
for (int i1 = 0; i1 < 3; i1++) {
System.out.println(random.nextInt(10));
}
}
System.out.println("---------------------------------------------------");
//生成三个随机数生成器
for (int i = 0; i < 3; i++) {
Random random = new Random(100);//有参构造
//每个生成器生成三个随机数
for (int i1 = 0; i1 < 3; i1++) {
System.out.println(random.nextInt(10));
}
}
}
}
output:
6
5
5
6
3
8
7
3
7
------------------------------------------------
5
0
4
5
0
4
5
0
4
构造方法源码:
Random():
/**
* 空参构造器在调用有参构造时,加了一个System.nanoTime()本地方法,返回的是任意时间,单位纳秒
*/
public Random() {
this(seedUniquifier() ^ System.nanoTime());
}
Random(long seed):
/**
* 随机数生成器是通过seed计算得到的,一个生成器随机生成数字可能不相同,但是多个生成器生成
* 的数字序列一致,可看作伪随机
*/
public Random(long seed) {
if (getClass() == Random.class)
this.seed = new AtomicLong(initialScramble(seed));
else {
// subclass might have overriden setSeed
this.seed = new AtomicLong();
setSeed(seed);
}
}
总结:
Random空参构造得到的随机数生成器跟当前时间有关系,产生的数字序列是真随机数
Random有参构造得到的随机数生成器跟seed有关系,每个生成器得到的数字序列是一致的,是伪随机数
3、Math.random()
for (int i = 0; i < 3; i++) {
double random = Math.random();
System.out.println(random);
}
output:
0.7661151572350932
0.13659792177891839
0.6669254467820507
此方法返回的是[0,1)之间double类型的随机值,没啥可说的,例如取[1,10]之间的int类型随机数,加一个强转即可
int v = (int)(Math.random() * 10 + 1);
System.out.println(v);
源码:
首先得到
public static double random() {
return RandomNumberGeneratorHolder.randomNumberGenerator.nextDouble();
}
再点进去得到:
private static final class RandomNumberGeneratorHolder {
static final Random randomNumberGenerator = new Random();
}
你会发现Math.random() 实际就是调用了Random类的 nextDouble() 方法,所以返回值也是double类型的
参考:https://blog.youkuaiyun.com/yezhuAndroid/article/details/78647984