做数据集实验时需要产生一些随机数据,所以 总结整理一下Random的使用
一、Random类构成
- 是
java.util
包下的一个类 class Random implements java.io.Serializable
- 常用的两个构造方法
public Random(){...}
public Random(long seed){...}
- 常用的方法
nextInt() next(int bis) nextInt(int bound)等。。。
二、不同构造函数的区别
-
空参构造方法
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得到的随机数就是固定的,但是连续调用结果是不一样的