random.nextint java_实例讲解Java中random.nextInt()与Math.random()的基础用法

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

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

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、小结

Math.random() 方法生成[0, 1)范围内的double类型随机数;Random类中的nextXxxx系列方法生成0-n的随机数;

Math.random() 线程安全,多线程环境能被调用;

如无特殊需求,则使用(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));

}

}

结果为:

8f7d2d204082159f13ba0565bea70920.png

如不想生成相同的随机数序列,则应只使用一个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/162913.html原文链接:https://javaforall.net

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


相关推荐

  • PHP开发api接口安全验证的实例,值得一看

    PHP开发api接口安全验证的实例,值得一看

    2021年10月29日
  • 单片机常用滤波算法

    单片机常用滤波算法单片机常用滤波算法 说明:假定从8位AD中读取数据(如果是更高位的AD可定义数据类型为int),子程序为get_ad();1、限幅滤波法(又称程序判断滤波法)A、方法:根据经验判断,确定两次采样允许的最大偏差值(设为A),每次检测到新值时进行判断,如果本次值与上次值之差&lt;=A,则本次值有效;如果本次值与上次值之差&gt;A,则本次值无效,放弃本次值,用上次值代替本次值。B、优点:能有效克服因…

    2022年5月4日
  • 学生选课管理系统c语言课程设计_大一c语言学生选课系统代码

    学生选课管理系统c语言课程设计_大一c语言学生选课系统代码《学生选课管理系统c语言程序》由会员分享,可在线阅读,更多相关《学生选课管理系统c语言程序(38页珍藏版)》请在人人文库网上搜索。1、include#include#includeintN1、N2;结构成本*头部1;structstudent*head2;结构课程/课程信息结构举止intnum1;/课程编号charname120;/课程名称chartype20;/课程性质int…

    2022年10月15日
  • OpenStack八大核心组件精讲之—neutron理论知识

    OpenStack八大核心组件精讲之—neutron理论知识OpenStack八大核心组件精讲之—neutron理论知识一、OpenStack网络二、Linux网络虚拟化(一)、Linux虚拟网桥(二)、虚拟局域网(三)、开发虚拟交换机三、openstack网络基础服务1、neutron网络结构2、网络子网与端口3、网络拓扑类型①、Local②、Flat③、VLAN④、VXLAN⑤、GRE⑥、GENEVE⑦、总结4、网络基本架构5、neutron-server6、Neutron遵循OpenStack的设计原则,采用开放性架构,通过插件.代理与网络提供者的配合来实

    2022年11月3日
  • VS2008安装失败原因!「建议收藏」

    VS2008安装失败原因!「建议收藏」从RTM到现在,我已安装十多回VS2008,发现总会安装OfficeTools的时候,会失败。百思不知其解。后在网上看到,是因为我们使用UltraISO制作激活成功教程的VS2008的时候带出来的问题,主要是Unicode的问题。于是我这个怎么解决呢?我尝试先用deamon打开原版的vs2008,再用untraISO将虚拟盘的所以文件加入新的ISO中,再将激活成功教程的setup.那个文件,加入。重新生成iso

    2022年9月6日
  • 广东移动DNS收集[通俗易懂]

    广东移动DNS收集[通俗易懂]有些网站的CDN有问题,使用第三方DNS会有访问不了的情况。多数是因为CDN通过DNS请求来源解析出对应线路的服务器IP,但使用第三方DNS时会出现把移动来源解析为电信来源,而服务器电信线路IP又拒绝非电信来源IP访问时,就会出现无法访问网站的情况。所以,使用移动网络的时候,还是尽量使用移动自己的DNS吧!这里收集了一下广东移动的DNS,非移动用户估计用不了。ns3.gd.

    2022年7月11日

发表回复

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

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