random.nextInt()与Math.random()基础用法

random.nextInt()与Math.random()基础用法1、来源java.util.Random类中的方法;Math类中的静态方法2、用法产生0-n的伪随机数(伪随机数参看最后注解)://两种生成对象方式:带种子和不带种子(两种方式的区别见注解)Randomrandom=newRandom();Integerres=random.nextInt(n);Integerres=(int)(Math.random()*n);3、

大家好,又见面了,我是你们的朋友全栈君。

1、来源

random.nextInt() 为 java.util.Random类中的方法;
Math.random() 为 java.lang.Math 类中的静态方法。

2、用法

产生0-n的伪随机数(伪随机数参看最后注解):

// 两种生成对象方式:带种子和不带种子(两种方式的区别见注解)
Random random = new Random();
Integer res = random.nextInt(n);
Integer res = (int)(Math.random() * n);

3、jdk源码

// random.nextInt(n)
public int nextInt(int n) {
    if (n <= 0)
        throw new IllegalArgumentException("n must be positive");

    if ((n & -n) == n)  // i.e., n is a power of 2
        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;
}
// Math.random()
public static double random() {
   Random rnd = randomNumberGenerator;
   // 第一次调用,生成一个随机数生成器
    if (rnd == null) rnd = initRNG();
    return rnd.nextDouble();
}

// 生成的方法为同步的,线程安全
private static synchronized Random initRNG() {
  Random rnd = randomNumberGenerator;
     return (rnd == null) ? (randomNumberGenerator = new Random()) : rnd;
 }

// 该方法为 Random 类中的方法
public double nextDouble() {
   return (((long)(next(26)) << 27) + next(27))
        / (double)(1L << 53);
}

4、总结

  1. Math.random() 方法生成[0, 1)范围内的double类型随机数;Random类中的nextXxxx系列方法生成0-n的随机数;
  2. Math.random() 线程安全,多线程环境能被调用;
  3. 如无特殊需求,则使用(int)(Math.random()*n)的方式生成随机数即可。

5、注:何谓伪随机数

伪随机既有规则的随机,Random类中的随机算法就是伪随机。
具体表现为:相同种子数的Random对象生成的随机数序列相同:

@Test
public void createProjectNo() {
     Random r1 = new Random(100);
     Random r2 = new Random(100);

     for (int i = 0; i < 100; i ++) {
         System.out.println(r1.nextInt(10)+", "+r2.nextInt(10));
     }
 }

结果为:
随机数生成结果

如不想生成相同的随机数序列,则应只使用一个Random类。而Math类中的随机数生成器 randomNumberGenerator 对象为静态的,可考虑使用。

6、注:Random类的两种构造方法区别

1、 源码

public Random() {
  this(seedUniquifier() ^ System.nanoTime());
}

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

2、区别
从源码中可以看到,未定义种子的构造方法里,使用当前系统时间相关的一个数字作为种子数,该种子数只作为随机算法的起源数字,与生成的随机数区间无关系。

这篇文章是我对Java中随机数的一些简单的理解,如有不对的地方或者其他的见解欢迎指导。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/162931.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • landsat 卫星波段组合以及envi下的展示

    landsat 卫星波段组合以及envi下的展示LandsatTM(ETM+)7个波段可以组合很多RGB方案用于不同地物的解译,Landsat8的OLI陆地成像仪包括9个波段,可以组合更多的RGB方案。OLI包括了ETM+传感器所有的波段,为了避免大气吸收特征,OLI对波段进行了重新调整,比较大的调整是OLIBand5(0.845–0.885μm),排除了0.825μm处水汽吸收特征;OLI全色波段Band8波段范围较窄,这种方式

  • mybatis-log plugiin激活码(JetBrains全家桶)

    (mybatis-log plugiin激活码)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~https://javaforall.cn/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~1STL…

  • python,pandas_python常用的科学计算库

    python,pandas_python常用的科学计算库[python][科学计算][pandas]使用指南

  • 2020/3/28微信小程序笔记

    2020/3/28微信小程序笔记1.左右布局display:flex;flex-direction:row;2.修改switch组件大小style=’zoom:.6’具体数值看个人而定3.仿个性签名关键词:textareatextarea限制字数关键词:maxlength\minlength4.设置渐变色css background: -webkit-linear-gradient(lef…

  • struts2讲解

    struts2讲解Struts2部分1.JavaEE软件三层结构和MVC的区别?JavaEE软件三层机构是由sun公司提供JavaEE开发规范的:Web层(表现层)、业务逻辑层、数据持久层。【其中WEB层会使用前端控制器模式】MVC是一种思想,是一种模式,将软件分为Model模型、View视图、Controller控制器。【JavaEE开发更强调三层结构,web层开发更注重MVC】Struts2就是web层开发框架,符合MVC模式;struts1、webwork、jsf、SpringMVC都是MVC…

    2022年10月26日
  • linux关闭防火墙或开启防火墙命令_linux防火墙怎么关闭

    linux关闭防火墙或开启防火墙命令_linux防火墙怎么关闭在linux中防火墙的开启和关闭是可以通过命令来执行的,那么具体是哪个命令呢?下面由学习啦小编为大家整理了linux关闭防火墙的相关命令,希望对大家有所帮助。1.Linux关闭防火墙命令1)永久性生效,重启后不会复原开启:chkconfigiptableson关闭:chkconfigiptablesoff2)即时生效,重启后复原开启:serviceiptablesstart关闭:s…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号