参考https://blog.csdn.net/md_shmily92/article/details/44059313

相关文章random.nextInt()与Math.random()基础用法

Java中Random也称为伪随机函数。

这句代码在Thinking in java中很常见

Java代码 
  1. Random rand = new Random(47);

但是下面两句代码放在一起就会有点晕了

Java代码 
  1. Random rand = new Random(47);
  2. int i = rand.nextInt(100);  //产生的随机数 不包括100,最大到99,

生成的随机数范围到底是什么,是0-47还是0-100,跟47和100又有什么关系。 
下面Random()方法做一些简单说明吧。

伪随机数 
对于随机数,大家都知道,计算机不可能产生完全随机的数字,所谓的随机数发生器都是通过一定的算法对事先选定的随机种子做复杂的运算,用产生的结果来近似的模拟完全随机数,这种随机数被称作伪随机数。伪随机数是以相同的概率从一组有限的数字中选取的。所选数字并不具有完全的随机性,但是从实用的角度而言,其随机程度已足够了。伪随机数的选择是从随机种子开始的,所以为了保证每次得到的伪随机数都足够地“随机”,随机种子的选择就显得非常重要。如果随机种子一样,那么同一个随机数发生器产生的随机数也会一样。 
一般地,我们使用同系统时间有关的参数作为随机种子。 

Random对象的生成 
Random类包含两个构造方法,下面依次进行介绍: 
(1)public Random() 
该构造方法使用一个和当前系统时间对应的相对时间有关的数字作为种子数,然后使用这个种子数构造Random对象。

Java代码 
  1. public Random() { this(++seedUniquifier + System.nanoTime()); }
  2. private static volatile long seedUniquifier = 8682522807148012L;

(2)public Random(long seed) 
该构造方法可以通过制定一个种子数进行创建。

Java代码 
  1. Random r = new Random(10);

切记,种子数只是随机算法的起源数字,和生成的随机数字的区间无关! 

随机种子对结果的影响 
(1)随机种子一定,随机数范围一定,则单个对象单次运行的结果一定 
选取随机种子为47,随机数最大值为19. 
下面代码运行10次的结果总是为18.

Java代码 
  1. public static void main(String[] args) {
  2. for (int i = 0; i < 10; i++) {
  3. Random rand = new Random(47);
  4. int j = rand.nextInt(20);
  5. System.out.println(j);
  6. }
  7. }

(2)随机种子一定,随机数范围一定,则多个对象单次运行的结果一定 
用相同的随机种子和随机范围生成了两个Random对象,但j和k的值每次都为18

Java代码 
  1. public static void main(String[] args) {
  2. for (int i = 0; i < 10; i++) {
  3. Random rand1 = new Random(47);
  4. Random rand2 = new Random(47);
  5. int j = rand1.nextInt(20);
  6. int k = rand2.nextInt(20);
  7. System.out.println(j);
  8. System.out.println(k);
  9. }
  10. }

(3)随机种子一定,随机数范围一定,但对象连续调用,运行结果不同 
在下面的代码中一次循环内,rand对象被连续调用了3次,分别输出了18,15,13. 
但每次循环的结果都一样,18,15,13会被顺序循环输出。 
也就是说同一个Random对象在随机种子和随着范围一定的情况下,连续调用的次数不同会生成不同的随机数。

Java代码 
  1. public static void main(String[] args) {
  2. for (int i = 0; i < 10; i++) {
  3. Random rand = new Random(47);
  4. int j = rand.nextInt(20);
  5. int k = rand.nextInt(20);
  6. int p = rand.nextInt(20);
  7. System.out.println(j);
  8. System.out.println(k);
  9. System.out.println(p);
  10. }
  11. }

产生特定区间的随机值

如产生5-26之间的随机值,为rand.nextInt(26-5+1)+5;

总结 
最后结合API中的说明,再简要总结写Random()方法的功能: 
(1)java.util.Random类中实现的随机算法是伪随机,也就是有规则的随机,所谓有规则的就是在给定种(seed)的区间内随机生成数字; 
(2)相同种子数的Random对象,相同次数生成的随机数字是完全相同的; 
(3)Random类中各方法生成的随机数字都是均匀分布的,也就是说区间内部的数字生成的几率均等;

(4) 47是一个产生随机数的魔法数字,这个问题到现在都没人能够解释,只是经过很多次试验得到的,包括《Thinking in java》的作者布鲁斯.艾克尔也这么提到:由47做种后,产生的随机数更加体现了随机性。它没有什么具体的意义,只要理解随机数如果有一个种子,哪么出现了比较随即的随机数,而当种子是47的时候,随即率是最大的。

关于Random(47)与randon.nextInt(100)的区别的更多相关文章

  1. Random方法中的nextInt(int arg0)方法讲解

    nextInt方法会生成一个随机的在5以内的数,负载均衡随机策略底层用的就是这个方法: Random rand = new Random(); int index = rand.nextInt(5); ...

  2. Java编程思想 Random(47)

    Random类包含两个构造方法,下面依次进行介绍:1. public Random()该构造方法使用一个和当前系统时间对应的相对时间有关的数字作为种子数,然后使用这个种子数构造Random对象.2. ...

  3. width:100% 和 max-width:100%; 有区别吗【转藏】

    这个博客是基于“Pelican+Markdown+定制的my-gum主题”的.定制的主题将博文正文页面的 右边栏去掉,这导致在Firefox等浏览器中,正文中大的图片会突破正文块的宽度,高度也得不到限 ...

  4. width为auto或者100%的区别

    一.四个理论 1. 某div不显示设置宽度,那么width为auto. 2. 某div的width在默认情况设置的是盒子模型中content的值 3. 某div的width为100%表示的是此div盒 ...

  5. Java中nextLine()与其他next(),nextInt(),nextFloat()的区别

    最近学习Java过程中遇到一个小问题,就是用nextInt()来接收输入内容时,按完回车之后会产生后面的内容无法输入的结果,因此来做个小记录.有不足的地方还请大家指出. 区别一  读取返回结果 nex ...

  6. border-radius:50%和100%的区别

    border-radius 值类型-百分比 border-radius的值是百分比的话,就相当于盒子的宽度和高度的百分比. 我们知道在一个正方形内做一个面积最大的圆形,这个圆的半径就为正方形边长的一半 ...

  7. background-size值为cover和值为100%的区别

    background-size:100% 100%;---按容器比例撑满,图片变形: background-size:cover;---把背景图片放大到适合元素容器的尺寸,图片比例不变. IE8及以下 ...

  8. min-width:100%和max-width:100%的区别

    1.width:100%和width:auto width:100%,设定对象的宽度占父元素的100%不论设定元素的margin值是多少,不包含margin: width:auto,根据设定对象的实际 ...

  9. width、height为auto或者100%的区别

    一.规则 1. 某div不设置宽度,那么width默认为auto. 2. 某子元素div的width为100%(或者设置为等于父元素宽度的具体值,比如父元素width为100px,子元素width也设 ...

随机推荐

  1. rails小重构:将图片加入产品Model

    原先的产品product模式中存放的是图片的url,必须手动将图片存入指定目录中.现在略作改动,在数据库中新建一个pictures表,其设定如下: class CreatePictures < ...

  2. css区分ie8/ie9/ie10/ie11 chrome firefox的代码

    以下是几个主要浏览器的css  hack汇总: 现有css样式为: .class{ color:red; } 判断IE8以上的浏览器才执行的代码/* IE8+ */ .class{ color:red ...

  3. Spring Aop中,获取被代理类的工具

    在实际应用中,顺着过去就是一个类被代理.反过来,可能需要逆向进行,拿到被代理的类,实际工作中碰到了,就拿出来分享下. /** * 获取被代理类的Object * @author Monkey */ p ...

  4. RocketMQ源码 — 七、 RocketMQ高可用(2)

    上一篇说明了RocketMQ怎么支持broker集群的,这里接着说RocketMQ实现高可用的手段之一--冗余. RocketMQ部署的时候一个broker set会有一个mater和一个或者多个sl ...

  5. java.lang.SecurityException: Can't make field constructor accessible

    原本使用GsonConvertor,在Android版本5.1.1上没有任何问题,结果切换到版本6.0.1上,出现以下所示问题: java.lang.IllegalArgumentException: ...

  6. Opencv3.1+python2.7的CentOS7安装

    http://blog.csdn.NET/daunxx/article/details/50506625 转载注释:有些包名和系统包名并不匹配,yum install 找不到的时候,可以yum sea ...

  7. 兼容 Android 4.4 透明状态栏与导航栏

    http://www.apkbus.com/Android-163388-1-1.html?_dsign=73d41229 android 系统自4.2 开始 UI 上就没多大改变,4.4 也只是增加 ...

  8. Python自学编程开发路线图(文中有免费资源)

    Python核心编程 免费视频资源<Python入门教程>:http://yun.itheima.com/course/145.html Python 基础学习大纲 所处阶段 主讲内容 技 ...

  9. JavaScript要点汇总——The Most Important

    关于JavaScript的基础变量,运算符的详解以及基本的分支循环嵌套已经在 JS基础变量及JS中的运算符 JS中的循环分支嵌套 说过了,今天我们所说的是做网页中最长用到的东西.内容不算少,要有耐心, ...

  10. css初始化标签属性--源码

    body, div, dl, dt, dd, ul, ol, li, h1, h2, h3, h4, h5, h6, pre, form, fieldset, input, p, blockquote ...