关于Random(47)与randon.nextInt(100)的区别
参考https://blog.csdn.net/md_shmily92/article/details/44059313
相关文章random.nextInt()与Math.random()基础用法
这句代码在Thinking in java中很常见
- Random rand = new Random(47);
但是下面两句代码放在一起就会有点晕了
- Random rand = new Random(47);
- int i = rand.nextInt(100); //产生的随机数 不包括100,最大到99,
生成的随机数范围到底是什么,是0-47还是0-100,跟47和100又有什么关系。
下面Random()方法做一些简单说明吧。
伪随机数
对于随机数,大家都知道,计算机不可能产生完全随机的数字,所谓的随机数发生器都是通过一定的算法对事先选定的随机种子做复杂的运算,用产生的结果来近似的模拟完全随机数,这种随机数被称作伪随机数。伪随机数是以相同的概率从一组有限的数字中选取的。所选数字并不具有完全的随机性,但是从实用的角度而言,其随机程度已足够了。伪随机数的选择是从随机种子开始的,所以为了保证每次得到的伪随机数都足够地“随机”,随机种子的选择就显得非常重要。如果随机种子一样,那么同一个随机数发生器产生的随机数也会一样。
一般地,我们使用同系统时间有关的参数作为随机种子。
Random对象的生成
Random类包含两个构造方法,下面依次进行介绍:
(1)public Random()
该构造方法使用一个和当前系统时间对应的相对时间有关的数字作为种子数,然后使用这个种子数构造Random对象。
- public Random() { this(++seedUniquifier + System.nanoTime()); }
- private static volatile long seedUniquifier = 8682522807148012L;
(2)public Random(long seed)
该构造方法可以通过制定一个种子数进行创建。
- Random r = new Random(10);
切记,种子数只是随机算法的起源数字,和生成的随机数字的区间无关!
随机种子对结果的影响
(1)随机种子一定,随机数范围一定,则单个对象单次运行的结果一定
选取随机种子为47,随机数最大值为19.
下面代码运行10次的结果总是为18.
- public static void main(String[] args) {
- for (int i = 0; i < 10; i++) {
- Random rand = new Random(47);
- int j = rand.nextInt(20);
- System.out.println(j);
- }
- }
(2)随机种子一定,随机数范围一定,则多个对象单次运行的结果一定
用相同的随机种子和随机范围生成了两个Random对象,但j和k的值每次都为18
- public static void main(String[] args) {
- for (int i = 0; i < 10; i++) {
- Random rand1 = new Random(47);
- Random rand2 = new Random(47);
- int j = rand1.nextInt(20);
- int k = rand2.nextInt(20);
- System.out.println(j);
- System.out.println(k);
- }
- }
(3)随机种子一定,随机数范围一定,但对象连续调用,运行结果不同
在下面的代码中一次循环内,rand对象被连续调用了3次,分别输出了18,15,13.
但每次循环的结果都一样,18,15,13会被顺序循环输出。
也就是说同一个Random对象在随机种子和随着范围一定的情况下,连续调用的次数不同会生成不同的随机数。
- public static void main(String[] args) {
- for (int i = 0; i < 10; i++) {
- Random rand = new Random(47);
- int j = rand.nextInt(20);
- int k = rand.nextInt(20);
- int p = rand.nextInt(20);
- System.out.println(j);
- System.out.println(k);
- System.out.println(p);
- }
- }
产生特定区间的随机值
如产生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)的区别的更多相关文章
- Random方法中的nextInt(int arg0)方法讲解
nextInt方法会生成一个随机的在5以内的数,负载均衡随机策略底层用的就是这个方法: Random rand = new Random(); int index = rand.nextInt(5); ...
- Java编程思想 Random(47)
Random类包含两个构造方法,下面依次进行介绍:1. public Random()该构造方法使用一个和当前系统时间对应的相对时间有关的数字作为种子数,然后使用这个种子数构造Random对象.2. ...
- width:100% 和 max-width:100%; 有区别吗【转藏】
这个博客是基于“Pelican+Markdown+定制的my-gum主题”的.定制的主题将博文正文页面的 右边栏去掉,这导致在Firefox等浏览器中,正文中大的图片会突破正文块的宽度,高度也得不到限 ...
- width为auto或者100%的区别
一.四个理论 1. 某div不显示设置宽度,那么width为auto. 2. 某div的width在默认情况设置的是盒子模型中content的值 3. 某div的width为100%表示的是此div盒 ...
- Java中nextLine()与其他next(),nextInt(),nextFloat()的区别
最近学习Java过程中遇到一个小问题,就是用nextInt()来接收输入内容时,按完回车之后会产生后面的内容无法输入的结果,因此来做个小记录.有不足的地方还请大家指出. 区别一 读取返回结果 nex ...
- border-radius:50%和100%的区别
border-radius 值类型-百分比 border-radius的值是百分比的话,就相当于盒子的宽度和高度的百分比. 我们知道在一个正方形内做一个面积最大的圆形,这个圆的半径就为正方形边长的一半 ...
- background-size值为cover和值为100%的区别
background-size:100% 100%;---按容器比例撑满,图片变形: background-size:cover;---把背景图片放大到适合元素容器的尺寸,图片比例不变. IE8及以下 ...
- min-width:100%和max-width:100%的区别
1.width:100%和width:auto width:100%,设定对象的宽度占父元素的100%不论设定元素的margin值是多少,不包含margin: width:auto,根据设定对象的实际 ...
- width、height为auto或者100%的区别
一.规则 1. 某div不设置宽度,那么width默认为auto. 2. 某子元素div的width为100%(或者设置为等于父元素宽度的具体值,比如父元素width为100px,子元素width也设 ...
随机推荐
- JavaScript设计模式之一封装
对于熟悉C#和Java的兄弟们,面向对象的三大思想(封装,继承,多态)肯定是了解的,今天我想讲讲如何在Javascript中利用封装这个特性,开讲! 我们会把现实中的一些事物抽象成一个Class并且把 ...
- java垃圾回收总结(2)
java垃圾回收总结(2) 上一篇文章 介绍了jvm虚拟机运行时内存结构以及如何标识需要回收的对象,这一节主要讲解垃圾回收的基本算法. 基本上 jvm内存回收有三种 基本算法 标记-清除 标记清除 ...
- Memcache 运行情况
Memcache Memcache是danga.com的一个开源项目,它是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的Hash表,能够用来存储各种格式的数据. 查看当前的me ...
- 安装 Anaconda 的正确姿势
下面以 Anaconda2 安装为例, 说明如何更加流畅的使用 Conda Install Anaconda2 安装 Anaconda2(从清华源下载比较快) wget https://mirrors ...
- 得到Android keystore签名的命令方法
keytool -list -v -keystore keyfile.jks 上面这个命令是用来得到一些签名字符串,这些字符串用来在各种平台上填资料的 再来个手动签名的命令: jarsigner -v ...
- JDK8安装时错误1335的解决
Win7安装JDK8 update65版本时,碰到错误1335,错误信息大概是一个cab文件损坏了,搜索了一下,有网站提供这个错误的修补工具,不过最终我没有下载这个工具,说是系统问题,但工具不是MS官 ...
- HashMap在高并发下如果没有处理线程安全会有怎样的安全隐患,具体表现是什么
Hashmap在并发环境下,可能出现的问题: 1.多线程put时可能会导致get无限循环,具体表现为CPU使用率100%: 原因:在向HashMap put元素时,会检查HashMap的容量是否足够, ...
- PHP快速获取MySQL数据库表结构
直接举例某个数据库中只有两个数据表,一个 test ,一个 xfp_keywords ,获取他们的数据库表结构. 此功能可以用于开发人员快速获取数据表结构通过获取的数据生成各种文件形式,用来快速理解数 ...
- EntityFramework 6.x和EntityFramework Core插入数据探讨
前言 一直以来对EF和EF Core都是单独分开来写,从未以比较的形式来讲解,如果您既用过EF 6.x也用过用EF Core是否有了解过EF和EF Core在插入数据时和返回主键有何异同呢?本篇博客是 ...
- 记录一次坑爹的Python脚本抢购低价手机经历!
无意间浏览到魅族官网,说魅族3限量100台.30号中午12点抢购.正好我爪机目前处于报废状态,就来一试手气了.11点多种,习惯性的看了下网页脚本,发现了检测是否到抢购时间,并返回抢购消息的ajax.于 ...