这句代码在Thinking in java中很常见
但是下面两句代码放在一起就会有点晕了
生成的随机数范围到底是什么,是0-47还是0-100,跟47和100又有什么关系。
下面对Random()的一些简单理解做一些说明吧。
伪随机数
对于随机数,大家都知道,计算机不可能产生完全随机的数字,所谓的随机数发生器都是通过一定的算法对事先选定的随机种子做复杂的运算,用产生的结果来近似的模拟完全随机数,这种随机数被称作伪随机数。
伪随机数是以相同的概率从一组有限的数字中选取的。所选数字并不具有完全的随机性,但是从实用的角度而言,其随机程度已足够了。
伪随机数的选择是从随机种子开始的,所以为了保证每次得到的伪随机数都足够地“随机”,随机种子的选择就显得非常重要。如果随机种子一样,那么同一个随机数发生器产生的随机数也会一样。
一般地,我们使用同系统时间有关的参数作为随机种子。
Random对象的生成
Random类包含两个构造方法,下面依次进行介绍:
(1)public Random()
该构造方法使用一个和当前系统时间对应的相对时间有关的数字作为种子数,然后使用这个种子数构造Random对象。
(2)public Random(long seed)
该构造方法可以通过制定一个种子数进行创建。
切记,种子数只是随机算法的起源数字,和生成的随机数字的区间无关!
随机种子对结果的影响
(1)随机种子一定,随机数范围一定,则单个对象单次运行的结果一定
选取随机种子为47,随机数最大值为20.
下面代码运行10次的结果总是为18.
(2)随机种子一定,随机数范围一定,则多个对象单次运行的结果一定
用相同的随机种子和随机范围生成了两个Random对象,但j和k的值每次都为18
(3)随机种子一定,随机数范围一定,但对象连续调用,运行结果不同
在下面的代码中一次循环内,rand对象被连续调用了3次,分别输出了18,15,13.
但每次循环的结果都一样,18,15,13会被顺序循环输出。
也就是说同一个Random对象在随机种子和随着范围一定的情况下,连续调用的次数不同会生成不同的随机数。
总结
最后结合API中的说明,再简要总结下Random()方法的功能:
(1)java.util.Random类中实现的随机算法是伪随机,也就是有规则的随机,所谓有规则的就是在给定种(seed)的区间内随机生成数字;
(2)相同种子数的Random对象,相同次数生成的随机数字是完全相同的;
(3)Random类中各方法生成的随机数字都是均匀分布的,也就是说区间内部的数字生成的几率均等;
写在最后
至于为什么随机种子在think in java中总是选47,看完上面的解释,可以简单理解为作者认为47是一个幸运数字或“魔数”吧
Random rand = new Random(47);
但是下面两句代码放在一起就会有点晕了
Random rand = new Random(47); int i = rand.nextInt(100);
生成的随机数范围到底是什么,是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,随机数最大值为20.
下面代码运行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); } }
总结
最后结合API中的说明,再简要总结下Random()方法的功能:
(1)java.util.Random类中实现的随机算法是伪随机,也就是有规则的随机,所谓有规则的就是在给定种(seed)的区间内随机生成数字;
(2)相同种子数的Random对象,相同次数生成的随机数字是完全相同的;
(3)Random类中各方法生成的随机数字都是均匀分布的,也就是说区间内部的数字生成的几率均等;
写在最后
至于为什么随机种子在think in java中总是选47,看完上面的解释,可以简单理解为作者认为47是一个幸运数字或“魔数”吧
发表评论
-
fastjson合并两个JSONArray
2018-08-20 01:10 0网上使用fastjson合并两个JSONArray的实例基本 ... -
通过ClassPathXmlApplicationContext启动spring容器
2018-05-27 00:21 0对于spring初学者如果想了解spring,那么最简单的方 ... -
git reflog结果分析
2018-05-23 23:50 0git reflog命令用于gitlab中查询历史提交记录, ... -
linux内核OOM源码分析
2018-05-12 21:17 1057Out Of Memory(OOM),即内存 ... -
Java map按值排序
2018-04-22 22:59 0本文提供一个排序工具类,用于Java中的map如何按照va ... -
IDEA中Enable Auto-Import如何取消
2018-05-27 17:34 3753在使用idea进行maven项目开发时,有时候修改了pom ... -
自定义RejectedExecutionHandler的实现
2018-03-12 21:07 01.RejectedExecutionHandler的 ... -
mysql悲观锁原理详解
2018-03-02 17:45 1581mysql中的锁概念 mysql ... -
ibatis两种批量删除方式
2018-02-28 16:23 0ibatis批量操作网上可以搜到到很多,但大部分都是根据某个 ... -
Java判断List中是否有重复元素
2018-02-24 16:25 0在日常Java开发过程中,我们会去判断List集合中是否存 ... -
Gson实现json与map互相转换
2018-02-23 19:04 01.什么是Gson 什么是Gson,我们从其官网上可以看到 ... -
Lambda expressions are not supported at this language level解决方案
2018-02-23 17:21 0Java8正式版本发布后,很多人希望第一时间能够在自己的ma ... -
Java Builder模式的两种实现
2018-02-08 22:06 0前话 在Java开发过程中经常会遇到有多个属性的对象,在构 ... -
linux服务查询jdk版本
2018-05-27 17:27 1731在linux环境下开发java程序的时候,有时候需要了解安 ... -
idea提交svn提示authentication required的解决方法
2017-05-10 10:18 0idea在提交svn项目代码的时候突然提示authenti ... -
Attribute 'singleton' is not allowed to appear in element 'bean' 解决方案
2017-05-05 17:00 01. 问题描述 在spring应用部署过程中抛出如下异常: ... -
python学习
2016-12-13 15:34 0函数介绍 函数 描述 cmp(x,y) ... -
java Date.setTime时间设置逆流
2017-05-05 16:42 1933业务开发过程中需要对java.util.Da ... -
maven包冲突(java.lang.NoSuchMethodError)解决
2017-02-09 11:04 7295在Java项目开发时一般会使用maven作为项目jar包依 ... -
JavaScript美术馆实例
2016-09-16 19:31 0前言 利用JavaScript和DOM去建立一个图片库, ...
相关推荐
Random rand = new Random(); int type = rand.nextInt(20); //随机生成0到19之间的值 if(type == 0){ return new Bee(); //生成蜜蜂对象 }else{ return new Airplane(); //生成敌机对象 } }
Random rand = new Random(); rand.Next(1,4); Student abc= new Student(); 调用: 调属性 对象名.属性=值; 调方法 对象名.方法名(); . 成员运算符: “的” 定义一个类 class 类名{ //成员变量 数据类型 变量名...
Random random = new Random(); if(fc>255) fc=255; if(bc>255) bc=255; int r=fc+random.nextInt(bc-fc); int g=fc+random.nextInt(bc-fc); int b=fc+random.nextInt(bc-fc); return new Color(r,g,b); } %...
初始化一个随机数发生器有两种方法: 不指定随机种子,系统自动选取当前时间作为随机种子 Random rand= new Random(); 指定一个int型参数作为随机种子 int iSeed=10; Random rand = new Random(10); 5.3 Random类 ...
char[] rand = rand(); int[] guess = guess(arr,input); if(guess[1] == arr.length){ System.out.println("恭喜,猜对了!!"); break; } else { System.out.println("猜对了"+guess[0]+"个字符,猜对了"+...
chart控件实例大全,chart使用方法教程 public partial class Histogram: System.Web.UI.Page { protected System.Web.UI.WebControls.Label Label... Random rand = new Random(); for(int index = 1; index ;
System.Random rand = new Random(); int len = rand.Next(4 , 6 ); char[] chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray(); System.Text.StringBuilder myStr = new System.Text.StringBuilder...
Java Random类的详细介绍(Java生成随机数)一、Random类的使用1.Random类生成随机数(int)的基本语法:2.几种常用的随机数生成二、Random类的详细介绍1.生成指定范围的数字2.Random.nextInt()与...Random r = new Rand
C#洗牌算法,简单演示! 算法一、 /// /// 洗牌算法 /// ... Random rand = new Random(); int iTarget = 0, iCardTemp = 0; for (int i = 0; i < iCards.Length; i++) { iTarget = rand
Random rand=new Random(); HttpSession session=request.getSession(true); response.setContentType("image/jpeg"); response.addHeader("pragma", "NO-cache"); response.addHeader("Cache-Control", ...
4位数数字验证码源程序 BufferedImage bi = new BufferedImage(width,height,BufferedImage.TYPE_INT_BGR); Graphics2D image = bi.createGraphics();... Random rand= new Random(); String str ="";
public static Random rand = new Random(); public static string getCode(int num) { string result = “”; string s = “uabcdefghijklmnopqrstuvwxyz0123456789”; for (int i = 0; i < num
本文实例讲述了C#实现随机洗牌的方法。分享给大家供大家参考。具体实现方法如下: 代码如下:#region 随机洗牌 ...Random rand = new Random(); for (int i = 0; i < 20; i++) { int x = rand.Next(li
代码如下: public class MathOps{ public static void main(String [] args){ Random rand=new Random(47); int i,j,k; j=rand.nextInf(100)+1; System.out.println(“j:”+j); k=rand.nextInt(100)+1; System.out....
我就废话不多说了,还是直接看代码吧,希望对你有帮助! import uuid def getUUID(): return "".join(str(uuid.uuid4()).split("-")).upper() ...Random rand = new Random(); StringBuffer sb=new St
Random random = new Random(); if(fc>255) fc=255; if(bc>255) bc=255; int r=fc+random.nextInt(bc-fc); int g=fc+random.nextInt(bc-fc); int b=fc+random.nextInt(bc-fc); return new Color(r,g,b); } %> <!...
兰根 简单随机发生器 安装 npm install @mohayonao/randgen ...let rand = new RandGen ( 123456789 ) . random ; let list = [ 1 , 2 , 3 , 4 , 5 ] ; console . log ( sample ( list , rand ) ) ; // 5 console . lo
public static Random rand = new Random(); private final char[] CHARS = RAND_RANGE.toCharArray(); // ���캯�� public MyVerifyCode() { } public static MyVerifyCode getInstance() { if ...
Random rand=new Random(); this.nextShapeNO=rand.Next(1,8); } switch(this.nextShapeNO) { case 1://田 firstPos=new Point(4,0); color=Color.Turquoise; break; ...
new Random(); private int randRange(int min, int max) { return rand.nextInt(max - min) + min; } private void swapAt(int i, int j) { int temp = array[i]; array[i] = array[j]; array[j] = temp; } public ...