java random()种子数_2. Java走过的坑-不随便设置随机种子

下面来看一段代码

public class RandomSeed {

public static void main(String[] args) {

Random random = new Random();

for(int i=1; i<4; i++){

System.out.println("第"+ i +"次" + random.nextInt());

}

}

}

控制台输出

第1次-1994303606

第2次-187157822

第3次-1572664715

代码很简单,我们一般也都是这么获取随机数的,我们看到除数的三次结果都是不同的,也都是随机数,下面再看看一组程序

public static void main(String[] args) {

// 多运行几次

Random random = new Random(1000);

for(int i=1; i<4; i++){

System.out.println("第"+ i +"次" + random.nextInt());

}

}

控制台输出

第1次-1244746321

第2次1060493871

第3次-1826063944

计算机不同输出的随机数也不同,但有一点是相同的:在同一台机器上不管允许多少次,打印出的随机数都是相同的,也就是说第一次运行会打印出这三个随机数,第二次打印还是这三个随机数,出现问题了,现在不是随机数不随机了吗?

我们找找问题何在,那是因为产生随机数的"种子"被固定了,在Java中随机数的产生取决于种子,随机数和种子之间应该遵守以下规则:

种子不同,产生不同的随机数

种子相同,实例不同产生不同的随机数

看完上面2个规则,用代码来解释

// 这是JDK中random类的无参构造函数

public Random() {

this(seedUniquifier() ^ System.nanoTime());

}

private static long seedUniquifier() {

// L'Ecuyer, "Tables of Linear Congruential Generators of

// Different Sizes and Good Lattice Structure", 1999

for (;;) {

long current = seedUniquifier.get();

long next = current * 181783497276652981L;

if (seedUniquifier.compareAndSet(current, next))

return next;

}

}

private static final AtomicLong seedUniquifier = new AtomicLong(8682522807148012L);

取了seedUniquifier ^ System.nanoTime()的返回值,seedUniquifier的代码我没细看,总之就是设置当前种子的算法,看来这样的不会重复的随机数了。

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);

}

}

这段代码是传入了一个参数的随机,实际上我们设定了随机种子是1000,运行多次的随机数是一样的因为永远都走

this.seed = new AtomicLong(initialScramble(seed));

这一步,虽然返回的是不同的实例,但是固定的种子还是会导致多次运行出现相同的随机数。

总结:

在java中有2种方法可以获取随机数:

java.util.Random和Math.random() 获取随机数,两者功能相同,一般非必须情况不要设置随机种子。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值