2019独角兽企业重金招聘Python工程师标准>>>

Random类 (java.util)

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

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

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

1、Random对象的生成

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

a、public Random()

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

b、public Random(long seed)

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

示例代码:

Random r = new Random();

Random r1 = new Random(10);

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

2、Random类中的常用方法

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

a、public boolean nextBoolean()

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

b、public double nextDouble()

该方法的作用是生成一个随机的double值,数值介于[0,1.0)之间。

c、public int nextInt()

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

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

d、public int nextInt(int n)

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

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

e、public void setSeed(long seed)

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

3、Random类使用示例

使用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());

}

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

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

b、关于Math类中的random方法

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

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

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

转载于:https://my.oschina.net/tianyuyangliu/blog/111780

java 中的随机数相关推荐

  1. Java中的随机数生成器:Random,ThreadLocalRandom,SecureRandom

    Java中的随机数生成器:Random,ThreadLocalRandom,SecureRandom 文中的 Random即:java.util.Random, ThreadLocalRandom 即 ...

  2. java中随机数怎么定义类_浅析Java中的随机数类

    Java中的随机数是否可以重复?Java中产生的随机数能否可以用来产生数据库主键?带着这个问题,我们做了一系列测试. 1.测试一: 使用不带参数的Random()构造函数 * @author Carl ...

  3. 用大气噪声生成Java中的随机数

    在Java中生成随机数时,我们有几个选择.但是,我怀疑在这篇文章中你会学到什么有趣或随意.所以,如果您对如何使用地球的大气噪声在Java中生成真正的随机数感兴趣,请继续阅读- (想自学习编程的小伙伴请 ...

  4. java中的随机数_Java获取随机数

    随机数在实际中使用很广泛,比如要随即生成一个固定长度的字符串.数字.或者随即生成一个不定长度的数字.或者进行一个模拟的随机选择等等.Java提供了最基本的工具,可以帮助开发者来实现这一切. 一.Jav ...

  5. Java 产生随机数:Java 中产生随机数的方法及应用汇总

    文章目录 前言 一.System.currentTimeMillis() 方法 1.1.System.currentTimeMillis() 方法原理剖析 1.2.实现随机数加法程序 二.Math.r ...

  6. Java中产生随机数的两个方法

    方法一.Math类有个random方法可以实现随机数的生成.Math.random()返回的是:返回带正号的 double 值,该值大于等于 0.0 且小于 1.0.在此基础上我们修改下就能得到一定范 ...

  7. Java中获取随机数

    Java中已经帮我们写好了一个类叫Random,这个类就可以生成一个随机数. 使用步骤: 1.导包:Random 这个类在哪 import java.util.Random; 导包的动作必须出现在类定 ...

  8. java中产生随机数

    import java.util.Random; /** * Java实用工具类库中的类java.util.Random提供了产生各种类型随机数的方法. * 它可以产生int.long.float.d ...

  9. 如何在java中产生随机数

    Java生成随机数我总共总结了5种方式: (一)Math.random()静态方法: 产生的随机数是0-1之间的一个double,0<=random<=1 使用: for(int i=0; ...

最新文章

  1. WEB--一个不错的想法
  2. SAP UI5 aggregation field type
  3. 06-Mapper动态代理
  4. Java中那些内存泄漏的场景!
  5. mysqludf_json将关系数据以JSON编码
  6. Excel利用函数进行转置(TRANSPOSE)、Excel中INDEX函数如何使用
  7. NACOS 2.0.3 集群客户端连接出现503 500异常处理 踩坑记录
  8. build constraints exclude all Go file GOland 导入“github.com/gin-gonic/gin“ 报红,
  9. java中linechart用法_Line Chart
  10. 学生用计算机的感叹号在哪,感叹号怎么打电脑(感叹号的用法及举例)
  11. Hulu校招补录已开始,1年内工作经验也可投!
  12. 如何把pdf转成图片jpg格式?俩个方法,1分钟搞定
  13. BB8700 bowser net
  14. [DAY001]考研数学极限的计算知识点与题目总结(一)
  15. linux中安装中文拼音输入法过程
  16. H5企业微信如何返回到菜单页?
  17. 学习总结-《父与子的编程之旅》chapter 11
  18. puts和fputs函数及其区别,C语言puts和fputs函数详解
  19. 关于3D打印材料及发展方向分析
  20. 更智能的烟灶套装,让厨房免受油烟困扰,云米AI油烟机Wing A1体验

热门文章

  1. npm install 报错(npm ERR! errno: -4048, npm ERR! code: ‘EPERM‘, npm ERR! syscall: ‘unlink‘,)
  2. 支持向量机smo matlab,理解支持向量机(三)SMO算法
  3. vector用法 java equals_java泛型vector的用法 | 学步园
  4. 安装erlang没有bin文件夹_Windows10有关jdk13.0.1的详细安装过程
  5. c语言实现语音检测vad_AI大语音(二)——语音预处理
  6. android手机冻屏问题,android 模拟冻屏 代码实现
  7. android item list居中,RecyclerView选中item居中显示
  8. modbus串口调试工具_用modscan测试modbus协议离散仪表数据方法
  9. iwrite提交不了作业_痛点!为什么开发了那么多软件,还是解决不了教学问题!...
  10. R语言与非参数统计(核密度估计)