java random构造方法_Java Random 含参与不含参构造函数的区别

本文详细介绍了Java中的Random类构造方法,包括无参数和带参数的构造器。无参数构造器使用当前时间作为种子,产生更强的随机性;带参数构造器则基于指定种子,可能导致更可预见的随机序列。通过示例代码展示了两种构造方法生成随机数的不同,并总结了它们的特性。
摘要由CSDN通过智能技术生成

##Random 通常用来作为随机数生成器,它有两个构造方法:

Random random = new Random();

Random random2 = new Random(50);

1.不含参构造方法:

public Random() {

setSeed(System.nanoTime() + seedBase);

++seedBase;

}

2.含参构造方法:

public Random(long seed) {

setSeed(seed);

}

都调用的 setSeed 方法:

public synchronized void setSeed(long seed) {

this.seed = (seed ^ multiplier) & ((1L << 48) - 1);

haveNextNextGaussian = false;

}

###可以看到,不含参构造方法每次都使用当前时间作为种子,而含参构造方法是以一个固定值作为种子

##什么是种子 seed 呢?

seed 是 Random 生成随机数时使用的参数:

Random 中最重要的就是 next(int) 方法,使用 seed 进行计算:

protected synchronized int next(int bits) {

seed = (seed * multiplier + 0xbL) & ((1L << 48) - 1);

return (int) (seed >>> (48 - bits));

}

其他 nextXXX 方法都是调用的 next()。

比如 nextInt(int):

public int nextInt(int n) {

if (n <= 0) {

throw new IllegalArgumentException("n <= 0: " + n);

}

if ((n & -n) == n) {

//调用 next()

return (int) ((n * (long) next(31)) >> 31);

}

int bits, val;

do {

bits = next(31);

val = bits % n;

} while (bits - val + (n - 1) < 0);

return val;

}

再比如 nextBoolean():

//也是调用的 next()

public boolean nextBoolean() {

return next(1) != 0;

}

##举个栗子:

@Test

public void testRandomParameter(){

System.out.println("Random 不含参构造方法:");

for (int i = 0; i < 5; i++) {

Random random = new Random();

for (int j = 0; j < 8; j++) {

System.out.print(" " + random.nextInt(100) + ", ");

}

System.out.println("");

}

System.out.println("");

System.out.println("Random 含参构造方法:");

for (int i = 0; i < 5; i++) {

Random random = new Random(50);

for (int j = 0; j < 8; j++) {

System.out.print(" " + random.nextInt(100) + ", ");

}

System.out.println("");

}

}

分别用含参构造方法和不含参构造方法创建 5 个随机生成器对象,每个随机生成器再生产 8 个随机数,对比下结果:

8bc7af2f769734d85bdd5fe75741c50e.png

再运行一次:

3aeacd55d08d0522379cddc161c929b5.png

##总结:

通过上述例子可以发现:

随机数是种子经过计算生成的。

不含参的构造函数每次都使用当前时间作为种子,随机性更强

而含参的构造函数其实是伪随机,更有可预见性

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值