`

Java编程那些事儿79——Random随机处理

阅读更多

Java编程那些事儿79——Random随机处理

陈跃峰

出自:http://blog.csdn.net/mailbomb

9.6.2 Random

在实际的项目开发过程中,经常需要产生一些随机数值,例如网站登录中的校验数字等,或者需要以一定的几率实现某种效果,例如游戏程序中的物品掉落等。

Java API中,在java.util包中专门提供了一个和随机处理有关的类,这个类就是Random类。随机数字的生成相关的方法都包含在该类的内部。

Random类中实现的随机算法是伪随机,也就是有规则的随机。在进行随机时,随机算法的起源数字称为种子数(seed),在种子数的基础上进行一定的变换,从而产生需要的随机数字。

相同种子数的Random对象,相同次数生成的随机数字是完全相同的。也就是说,两个种子数相同的Random对象,第一次生成的随机数字完全相同,第二次生成的随机数字也完全相同。这点在生成多个随机数字时需要特别注意。

下面介绍一下Random类的使用,以及如何生成指定区间的随机数组以及实现程序中要求的几率。

1Random对象的生成

Random类包含两个构造方法,下面依次进行介绍:

apublic Random()

该构造方法使用一个和当前系统时间对应的相对时间有关的数字作为种子数,然后使用这个种子数构造Random对象。

bpublic Random(long seed)

该构造方法可以通过制定一个种子数进行创建。

示例代码:

Random r = new Random();

Random r1 = new Random(10);

再次强调:种子数只是随机算法的起源数字,和生成的随机数字的区间无关。

2Random类中的常用方法

Random类中的方法比较简单,每个方法的功能也很容易理解。需要说明的是,Random类中各方法生成的随机数字都是均匀分布的,也就是说区间内部的数字生成的几率是均等的。下面对这些方法做一下基本的介绍:

apublic boolean nextBoolean()

该方法的作用是生成一个随机的boolean值,生成truefalse的值几率相等,也就是都是50%的几率。

bpublic double nextDouble()

该方法的作用是生成一个随机的double值,数值介于[0,1.0)之间,这里中括号代表包含区间端点,小括号代表不包含区间端点,也就是01之间的随机小数,包含0而不包含1.0

cpublic int nextInt()

该方法的作用是生成一个随机的int值,该值介于int的区间,也就是-231231-1之间。

如果需要生成指定区间的int值,则需要进行一定的数学变换,具体可以参看下面的使用示例中的代码。

dpublic int nextInt(int n)

该方法的作用是生成一个随机的int值,该值介于[0,n)的区间,也就是0n之间的随机int值,包含0而不包含n

如果想生成指定区间的int值,也需要进行一定的数学变换,具体可以参看下面的使用示例中的代码。

epublic void setSeed(long seed)

该方法的作用是重新设置Random对象中的种子数。设置完种子数以后的Random对象和相同种子数使用new关键字创建出的Random对象相同。

3Random类使用示例

使用Random类,一般是生成指定区间的随机数字,下面就一一介绍如何生成对应区间的随机数字。以下生成随机数的代码均使用以下Random对象r进行生成:

Random r = new Random();

a、生成[0,1.0)区间的小数

double d1 = r.nextDouble();

直接使用nextDouble方法获得。

b、生成[0,5.0)区间的小数

double d2 = r.nextDouble() * 5;

因为nextDouble方法生成的数字区间是[0,1.0),将该区间扩大5倍即是要求的区间。

同理,生成[0,d)区间的随机小数,d为任意正的小数,则只需要将nextDouble方法的返回值乘以d即可。

c、生成[1,2.5)区间的小数

double d3 = r.nextDouble() * 1.5 + 1;

生成[1,2.5)区间的随机小数,则只需要首先生成[0,1.5)区间的随机数字,然后将生成的随机数区间加1即可。

同理,生成任意非从0开始的小数区间[d1,d2)范围的随机数字(其中d1不等于0),则只需要首先生成[0,d2-d1)区间的随机数字,然后将生成的随机数字区间加上d1即可。

d、生成任意整数

int n1 = r.nextInt();

直接使用nextInt方法即可。

e、生成[0,10)区间的整数

int n2 = r.nextInt(10);

n2 = Math.abs(r.nextInt() % 10);

以上两行代码均可生成[0,10)区间的整数。

第一种实现使用Random类中的nextInt(int n)方法直接实现。

第二种实现中,首先调用nextInt()方法生成一个任意的int数字,该数字和10取余以后生成的数字区间为(-10,10),因为按照数学上的规定余数的绝对值小于除数,然后再对该区间求绝对值,则得到的区间就是[0,10)了。

同理,生成任意[0,n)区间的随机整数,都可以使用如下代码:

int n2 = r.nextInt(n);

n2 = Math.abs(r.nextInt() % n);

f、生成[0,10]区间的整数

int n3 = r.nextInt(11);

n3 = Math.abs(r.nextInt() % 11);

相对于整数区间,[0,10]区间和[0,11)区间等价,所以即生成[0,11)区间的整数。

g、生成[-3,15)区间的整数

int n4 = r.nextInt(18) - 3;

n4 = Math.abs(r.nextInt() % 18) - 3;

生成非从0开始区间的随机整数,可以参看上面非从0开始的小数区间实现原理的说明。

h、几率实现

按照一定的几率实现程序逻辑也是随机处理可以解决的一个问题。下面以一个简单的示例演示如何使用随机数字实现几率的逻辑。

在前面的方法介绍中,nextInt(int n)方法中生成的数字是均匀的,也就是说该区间内部的每个数字生成的几率是相同的。那么如果生成一个[0,100)区间的随机整数,则每个数字生成的几率应该是相同的,而且由于该区间中总计有100个整数,所以每个数字的几率都是1%。按照这个理论,可以实现程序中的几率问题。

示例:随机生成一个整数,该整数以55%的几率生成1,以40%的几率生成2,以5%的几率生成3。实现的代码如下:

int n5 = r.nextInt(100);

int m; //结果数字

if(n5 < 55){ //55个数字的区间,55%的几率

m = 1;

}else if(n5 < 95){//[55,95)40个数字的区间,40%的几率

m = 2;

}else{

m = 3;

}

因为每个数字的几率都是1%,则任意55个数字的区间的几率就是55%,为了代码方便书写,这里使用[0,55)区间的所有整数,后续的原理一样。

当然,这里的代码可以简化,因为几率都是5%的倍数,所以只要以5%为基础来控制几率即可,下面是简化的代码实现:

int n6 = r.nextInt(20);

int m1;

if(n6 < 11){

m1 = 1;

}else if(n6 < 19){

m1= 2;

}else{

m1 = 3;

}

在程序内部,几率的逻辑就可以按照上面的说明进行实现。

4、其它问题

a、相同种子数Random对象问题

前面介绍过,相同种子数的Random对象,相同次数生成的随机数字是完全相同的,下面是测试的代码:

Random r1 = new Random(10);

Random r2 = new Random(10);

for(int i = 0;i < 2;i++){

System.out.println(r1.nextInt());

System.out.println(r2.nextInt());

}

在该代码中,对象r1r2使用的种子数都是10,则这两个对象相同次数生成的随机数是完全相同的。

如果想避免出现随机数字相同的情况,则需要注意,无论项目中需要生成多少个随机数字,都只使用一个Random对象即可。

b、关于Math类中的random方法

其实在Math类中也有一个random方法,该random方法的工作是生成一个[0,1.0)区间的随机小数。

通过阅读Math类的源代码可以发现,Math类中的random方法就是直接调用Random类中的nextDouble方法实现的。

只是random方法的调用比较简单,所以很多程序员都习惯使用Math类的random方法来生成随机数字。

分享到:
评论

相关推荐

    学习JAVA编程,完成作业——编一个控制台梭哈游戏.zip

    在本项目中,"学习JAVA编程,完成作业——编一个控制台梭哈游戏.zip",开发者采用Java语言实现了一个基于控制台的梭哈(Poker)游戏。这是一门编程课程的作业,目的是让学生掌握Java的基本语法、面向对象编程概念...

    java语言——老师随机点名系统

    综上所述,"java语言——老师随机点名系统"涵盖了Java语言基础、图形用户界面设计、随机数生成、数据结构与算法、文件操作、异常处理以及测试等多个核心知识点。通过学习和实践这样的项目,开发者可以巩固Java编程...

    用java制作的小设计——简易骰子游戏 附带实验报告

    标题中的“用java制作的小设计——简易骰子游戏”揭示了这个项目是使用Java编程语言实现的一个简单游戏。Java是一种广泛使用的面向对象的编程语言,以其跨平台的特性而闻名,能够编写一次,到处运行。在这个简易骰子...

    用Java写的小游戏——剪刀石头布.zip

    在这个名为“用Java写的小游戏——剪刀石头布.zip”的压缩包中,包含了一个使用Java编程语言实现的经典小游戏——剪刀石头布。这个游戏是两个人之间的简单互动游戏,通常用于决策或者娱乐,规则简单:剪刀胜布,布胜...

    Java实现随机森林算法

    在Java中实现随机森林算法通常需要使用机器学习库,比如Weka或者Apache Spark的MLlib。下面我将展示一个使用Weka库的简单示例,来说明如何使用随机森林算法对数据进行分类。 首先,你需要在项目中引入Weka库。如果...

    初学java——模拟路网(csdn)————程序.pdf

    初学Java——模拟路网(csdn)————程序 本资源归纳了初学Java——模拟路网(csdn)————程序的知识点,主要包括Java基础知识、红绿灯模拟、随机数生成、道路生成、车辆模拟等几个方面。 一、Java基础知识 ...

    Java案例——随机抽取幸运观众.zip

    在本Java案例中,我们将探讨如何使用Java编程语言来实现一个随机抽取幸运观众的功能。这个功能常见于各种抽奖活动或在线互动中,用于从一系列参与者中随机选择一名或多名“幸运儿”。通过学习这个案例,我们可以掌握...

    JAVA-SE入门学习——第七讲常用API及异常

    【JAVA-SE入门学习——第七讲常用API及异常】 在Java编程中,API(Application Programming Interface)是开发者用来实现特定功能的一系列预先定义好的类、方法和接口的集合。Java中的API主要指的是JDK(Java ...

    Java随机点名源码

    Java随机点名源码是一种基于Java编程语言的小型应用程序,用于在给定的姓名列表中随机选择学生进行点名。这个程序特别适用于教师或者需要在人群中随机选取对象的场合,如会议、活动等。该程序的最新版本是在2019年...

    Java代码实现随机生成汉字的方法

    Java代码实现随机生成汉字的方法 Java代码实现随机生成汉字的方法是指利用Java语言编写的程序来随机生成汉字。该方法可以生成随机的汉字,满足特定的需求。 背景知识 -------- GB 2312-80 是中国国家标准简体中文...

    java小程序——石头剪刀布

    在计算机科学中,这种类型的游戏通常用于教学目的,因为它涉及到基本的输入输出处理、条件判断以及用户交互,这些都是Java编程的核心概念。 【描述】:“这是我自己写的java代码,学习java的比较好的例子,界面采用...

    剑指offer计划2(链表)---java(csdn)————程序.pdf

    在本文中,我们将深入探讨与链表相关的三个Java编程题目,这些都是出自《剑指Offer》这本书的挑战。我们将依次分析每个题目,理解其要求,并详细解释解决方案。 **第一题:从尾到头打印链表** 这道题目的目标是从...

    Java重启式随机游走代码(Random Walk with Restart,RWR)

    Java重启式随机游走(Random Walk with Restart, RWR)是一种在复杂网络中探索节点间关系的算法。在社交网络、信息检索、生物网络分析等领域有着广泛应用。此算法结合了随机游走的思想与重启机制,使得随机游走过程...

    (Java)人群随机分组 by 夜猫

    在Java编程中,实现"人群随机分组"的需求通常涉及到数组、集合以及随机数生成等基础知识。本项目 `(Java)人群随机分组 by 夜猫` 提供了一个解决方案,旨在将一组人(可以理解为一个数据列表)尽可能均匀地划分为四个...

    JAVA趣味编程100实例

    在标题“JAVA趣味编程100实例”下,描述中提到“很实用的java趣味编程小程序”,这说明本文件旨在通过有趣的编程实例来帮助学习者加深对Java语言的理解和应用能力。通过解决实际问题来提高编程技能,这些实例很可能...

    了解Java:RandomAccess

    标题中的“了解Java:RandomAccess”指的是Java编程语言中关于RandomAccess接口或随机访问的概念。在Java中,RandomAccess主要用于标记那些支持高效随机读取的输入流。这意味着,对于实现了RandomAccess接口的输入流...

    java讲义以及编程作业

    从给定文件的内容中,我们可以提炼出一些关于Java编程的核心知识点,包括Java编程基础、面向对象编程、图形用户界面(GUI)编程、随机数生成、事件处理等方面的知识。 首先,文件中提到了Stanford教授的课程讲义,...

    Java基础之Random随机数.docx

    Java基础之Random随机数 Java中的随机数使用率非常高,因此掌握随机数的使用是非常重要的。在Java中,Random类提供了产生随机数的方法,下面将详细介绍Random类的使用。 Random类的使用 Random类是Java中生成...

    java随机点名系统

    Java随机点名系统是一种利用Java编程语言开发的软件工具,主要功能是实现课堂或会议中的随机选取参与者进行点名。这种系统通常会读取预先存储的参与者名单,并通过算法确保点名的公正性,避免重复。在这个项目中,...

    国内首个80nm自旋转移矩——磁随机存储器芯片器件制备成功.pdf

    自旋转移矩磁随机存储器(Spin-Transfer Torque Magnetic Random Access Memory,简称STT-MRAM)是一种新型的非易失性存储器,它结合了传统磁性存储器的高密度和快读写速度以及半导体存储器的非易失性和集成度高特点...

Global site tag (gtag.js) - Google Analytics