做数据集实验时需要产生一些随机数据,所以 总结整理一下Random的使用
空参构造方法
public Random() { this(seedUniquifier() ^ System.nanoTime()); } //System.nanoTime()返回最准确的可用系统计时器的当前值,以纳秒为单位 //currentTimeMillis()当前时间与世界时 1970 年 1 月 1 日午夜之间的时间差(以毫秒为单位测量)使用当前系统计数器的值作为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); } }自定一个数字作为seed,只是随机算法的起源数字,和生成的随机数字的区间无关
几种可能的情况和结果随机种子一定,随机数范围一定,则单个对象不管运行多少次结果一定,但是空参构造器就不一定
for (int i = 0; i < 10; i++) { Random rand1 = new Random(100); int j = rand1.nextInt(1000); System.out.println(j); } //结果都是相同的随机种子一定,随机数范围一定,则多个对象多次运行的结果也是相同的
for (int i = 0; i < 10; i++) { Random rand1 = new Random(100); Random rand2 = new Random(100); int j = rand1.nextInt(1000); int k = rand2.nextInt(1000); System.out.println(j); System.out.println(k); } //j和k每次都是相同的,也就是说seed相同得到的结果随机种子一定,随机数范围一定,但对象连续调用,运行结果不同,但是多次调用每个是一样的
for (int i = 0; i < 10; i++) { Random rand1 = new Random(100); int j = rand1.nextInt(1000); int k = rand1.nextInt(1000); System.out.println(j); System.out.println(k); } //输出 915 250 915 250 915 250总结:
无参构造器得到的对象不论是不是同一个,区间bound是多少,结果都是在区间内的不同数带参的构造器只要seed相同,得到的对象固定bound得到的随机数就是固定的,但是连续调用结果是不一样的