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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • CentOS7 添加FTP用户并设置权限

    CentOS7 添加FTP用户并设置权限

    2021年10月19日
    41
  • rabbitmq集群搭建_mongodb集群搭建

    rabbitmq集群搭建_mongodb集群搭建docker单容器部署创建桥接网络,用于容器间通信$dockernetworkcreatemq-network首先启动3个rabbitmq容器$dockerrun–namerabbit01\ -eRABBITMQ_SERVER_ADDITIONAL_ERL_ARGS=”-setcookieCOUBJLKLQCIAPKIQZGGJ”\ –hostnamerabbit01–networkmq-network\ -p5672:5672-p1567

    2022年9月11日
    0
  • django详解_java cookie

    django详解_java cookie前言cookie:在网站中,http请求是无状态的。也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户。cookie的出现就是为了解决这个问题,第一次登录

    2022年8月7日
    4
  • 要慎用mysql的enum字段的原因

    要慎用mysql的enum字段的原因

    2021年6月14日
    128
  • 浙江python信息技术教材_人工智能、Python…浙江省三到九年级将使用信息技术新修订教材…

    浙江python信息技术教材_人工智能、Python…浙江省三到九年级将使用信息技术新修订教材…浙江省教研室相关负责人表示,目前根据现行的高中教材,对小学、初中的老教材进行了修订,新教材将于今年9月投入使用,最新的线上教师培训也刚刚结束。扣哒世界作为全球最大的中小学人工智能和Python代码编程教学平台,已经从2019年开始系统支持浙江省中小学人工智能和Python代码编程师资培训。根据浙江省最新的教材目录,从小学三年级一直到九年级,内容都有不同程度的调整。三年级新增了“信息社会”和“网络生…

    2022年5月16日
    35
  • oracle 错误01017,ORA-01017:用户名密码出错 故障实例

    oracle 错误01017,ORA-01017:用户名密码出错 故障实例sysdba登录ORA-01017:用户名密码出错故障排查实例早上接到一个朋友的急call,说是数据库的sys登录不了系统叻。普通用户连接可以登录,只要是assysdba就提示ORA-01017:用户名密码出错。很显然这是一个典型的sysdba登录的问题。首先要他查看了sqlnet文件。SQLNET.AUTHENTICATION_SERVICES=(NONE)启动密码文件验证了,接着查看…

    2022年5月31日
    41

发表回复

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

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