Java常用API:Math.random和Random

1、Math.random()是令系统随机选取大于等于 0.0 且小于 1.0 的伪随机 double 值

例如:number=Math.random()*3+1,设置一个随机1到4的变量。

2、Random类带参与不带参的区别:

     2.1:带参 

     含参构造是使用一个固定值(参数)作为种子(种子也就是Random生成随机数时使用的参数)。每次使用时先创建一个Random对象,也叫随机数生成器,然后调用Random.nextXX()方法获取数值。每次生成的随机数是一个伪随机数

    2.2:不带参

     不含参的构造方法每次都是使用当前系统时间作为种子,因此每次的结果都是独一无二的。

3、具体用法(涉及以下问题)

   3.1.Math.random()使用方式;
   3.2.Random的使用方式,有参和无参的区别;
   3.3.Random.nextInt(n) n的作用;
   3.4.Math.random()和Random之间的关系


   3.1.Math.random()使用方式:

	System.out.println("通过Math.random产生的随机数列");
        for (int j = 0; j < 8; j++) {
            System.out.println(Math.random() + ",");
        }

运行结果是产生Double类型的随机数。


   3.2.Random的使用方式,有参和无参的区别:

生成2个随机数生成器即Random对象,种子是50,代码如下:

3.2.1-有参:

       for (int i = 0; i < 2; i++) {
            //创建2个随机数生成器
            Random random = new Random(50);
            for (int j = 0; j < 3; j++) {
                //每个随机数生成器产生8个数
                //n 要返回的随机数的边界 也就是随机数的范围是0-50之间的整数
                System.out.println(random.nextInt(50) + ",");
            }
            System.out.println("");
        }

3.2.2-无参:

    	System.out.println("Random不含种子参数\n");
        for (int i = 0; i < 2; i++) {
            //创建2个随机函数生成器
            Random random = new Random();
            for (int j = 0; j < 3; j++) {
                //每个随机数生成器产生3个数
                System.out.println(random.nextInt(50) + ",");
            }
            System.out.println("");
        }

运行结果分析:

有参数构造创建随机数生成器然后生成随机数序列的时,产生的随机数是种子经过计算得到的,具有相同种子数的Random对象生成的随机数序列相同。

通过无参构造创建Random对象,其本质是也是种子,只不过种子不是具体的数值,而是系统当前的时间,因此创建的随机数是独一无二的。

备注:random.nextInt (50)代表生成的随机数范围是0-50。

Random类构造源码如下:

    /**
     * Creates a new random number generator. This constructor sets
     * the seed of the random number generator to a value very likely
     * to be distinct from any other invocation of this constructor.
     */
    public Random() {
        this(seedUniquifier() ^ System.nanoTime());
    }

创建一个随机数生成器,构造方法设置随机数生成器的种子是独一无二的,

因此点击this,跳转到对应的有参构造中,由代码可以看出种子的生成和当前时间有关系,因此生成的种子是唯一的。

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

通过以上比较得出以下结论:

1、随机数是种子经过计算生成的。
2、Random类中不含参的构造函数每次都是使用当前时间作为种子,随机性更强;而含参数的构造函数是伪随机的,更有可预见性。
3、具有相同种子值的Random对象生成的随机数相同;种子值不同,产生的随机数不再一致。


3.4、Math.random()和Random之间的关系:

源码如下:

public final class Math { 
     。。。。。省略
     public static double random() {
        return NoImagePreloadHolder.INSTANCE.nextDouble();
    }
     。。。。。省略
    private static class NoImagePreloadHolder {
        private static final Random INSTANCE = new Random();
    }
 
}

从Math类的源码可以看出Math.random()内部调用的方法就是Random类中的nextDouble()方法,因此明白了文章一开始Math.random()返回的是double类型值。

【第一次学习,想分享Java学习历程中的点滴,如有错误,感谢大家指正】

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值