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中随机数的一些简单的理解,如有不对的地方或者其他的见解欢迎指导。

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • XAMPP环境的搭建[通俗易懂]

    XAMPP环境的搭建[通俗易懂]XAMPP是一个强大的集成软件包(什么是集成软件包?就是多个软件打包一起安装了,比如office办公软件包括了word、Excel、PPT)XAMPP包括了Apache,MySQL,PHP,Perl

    2022年6月30日
    29
  • java中“53”个关键字(含2个保留字)

    java中“53”个关键字(含2个保留字)1.java的关键字(keyword)有多少个?   51+2个保留字=53个关键字(java的关键字都是小写的!!)    2.java的保留字(reserve word)有多少个?问题:分别是什么?    2个保留字     Java语言的的保留字是指预留的关键字    1).const  有道释义:n. 常量,

    2022年7月8日
    22
  • HttpSession的生命周期和何时销毁

    HttpSession的生命周期和何时销毁HttpSession生命周期:1.什么时候创建HttpSession1).对于JSP:是否浏览器访问服务端的任何一个JSP或Servlet,服务器都会立即创建一个HttpSession对象呢?不一定。①.若当前的JSP或(Servlet)是客户端访问的当前WEB应用的第一个资源,且JSP的page指定的session属性为false,则服务器就不会为JSP创建一个HttpSess…

    2022年7月12日
    15
  • 西门子scl语言和c语言,西门子PLC的SCL语言与STL语言比较一下-工业支持中心-西门子中国…「建议收藏」

    西门子scl语言和c语言,西门子PLC的SCL语言与STL语言比较一下-工业支持中心-西门子中国…「建议收藏」1.STL有点类似汇编语言,和机器码对应,无论哪种语言写的PLC程序都可以转换成STL查看,所以掌握基本的STL指令和语法是很有帮助的。另外STL直接操作寄存器,实现同样功能时可以减少运算量和寄存器调用次数,并且只关心数据类型的长度(例如不区分int和word),减少了数据类型转换,总的来说执行效率高,但实现复杂运算和逻辑时编程繁琐。2.SCL类似于高级语言Pascal、C之类,可以通过简单的语…

    2022年10月7日
    0
  • 分水岭算法及案例

    分水岭算法及案例分水岭算法WatershedAlgorithm(分水岭算法),顾名思义,就是根据分水岭的构成来考虑图像的分割。现实中我们可以或者说可以想象有山有湖的景象,那么那一定是水绕山,山围水的情形。当然在需要的时候,要人工构筑分水岭,以防集水盆之间的互相穿透。而区分高山(plateaus)与水的界线,以及湖与湖之间的间隔或都是连通的关系,就是我们可爱的分水岭(watershed)。如果图像中的目标物体是

    2022年6月15日
    26
  • 在虚拟机上安装使用LoadRunner教程

    在虚拟机上安装使用LoadRunner教程记录一下我的安装LoadRunner血泪史1.LoadRunner11在win10上使用总是出问题,后来看到只能在win7在用,就在VMware建了个win7镜像,在msdn(https://msdn.itellyou.cn/)上下了win7的cn_windows_7_enterprise_x64_dvd_x15-70741.iso,后来安装VMwareTools的时候会报“安装程序无法继续。本程序需要您将此虚拟机上安装的操作系统更新到SP1”这个才是能用的镜像:cn_windows_7_enter

    2022年5月23日
    88

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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