`

Random是作用及使用

    博客分类:
  • java
阅读更多

import java.util.Random;

public class random1 {
  public static void main(String args[]){
	  Random random =new Random();
	  int in = random.nextInt(100);
	  System.out.println(in+" ");
	  
	  Random coin=new Random();
	  boolean x=coin.nextBoolean(); //作用
	  if(x){
		  System.out.println(x+"正面");
	 }else{
		 System.out.println(x+"反面");
	 }
  }
}


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方法来生成随机数字。
分享到:
评论

相关推荐

    java基础random的作用和使用步骤

    java基础random的作用和使用步骤

    FLASH中使用Random函数创建随机数

    总的来说,Flash中的Random函数是创建动态和交互内容的强大工具,无论是在游戏开发、动画制作还是其他互动项目中,都能发挥重要作用。通过熟练掌握和灵活运用,可以大大增加你的作品的趣味性和不可预测性。

    随机数产生器random number

    在`try-random number`这个文件中,可能包含了上述或类似的函数实现,通过阅读源代码,我们可以学习如何在实际项目中使用这些方法。初学者可以通过这个小项目来练习如何调用这些函数,以及理解随机数在不同情境下的...

    Random Process for Engineers

    这两个概念在处理复杂问题时尤为重要,尤其是在分析系统中各部分之间的相互作用时。例如,在通信系统中评估信号传输过程中干扰的影响时,就需要用到这些概念。 #### 二、随机变量及其分布 ##### 1.3 随机变量及其...

    python random库

    - **密码学**:虽然 `random` 模块不适合用于安全敏感的应用场景,但在一些非关键的安全应用中仍可发挥作用。 综上所述,`random` 模块是 Python 中一个非常实用且强大的工具,掌握其基本用法和高级功能将极大地...

    RandomForest.zip

    此外,用户可能还需要阅读代码文档或注释,理解每个函数的作用和用法,以便正确地调用和修改代码以满足自己的需求。 总之,"RandomForest.zip"提供的MATLAB代码是实现随机森林算法的一个实用资源,无论你是想进行...

    2001.Random Forests.Machine Learning

    随机森林算法是由Leo Breiman在1999年提出的一种基于决策树分类器的集成算法...这种算法的灵活性、高准确率和易于实现的特性,使它在机器学习和数据挖掘领域中占据了重要的地位,并在各种实际应用中发挥着巨大的作用。

    前端开源库-random-unique-id

    使用`random-unique-id`库非常简单,开发者只需引入库文件,然后调用提供的API即可生成ID。这样的库对于前端开发者来说,既方便了开发,又保证了生成唯一ID的质量。 总的来说,`random-unique-id`是一个高效、安全...

    RandomForest

    同时,代码中的注释将帮助理解每个步骤的作用和实现细节。 通过这样的Java实现,开发者可以更直观地理解随机森林的工作流程,同时也能灵活地调整参数以适应不同问题的需求,例如改变树的数量、特征选择策略等。此外...

    A Random Number Generator in Verilog in Verilog

    总之,随机数生成器是数字设计中的一个重要组成部分,它在多个领域都发挥着重要的作用。在Verilog中设计随机数生成器需要对算法和硬件实现都有深入的了解。通过本讲座,参与者将能够掌握如何在硬件层面实现和应用...

    YOLOV4之dataloader的get_random_data模块的详细推导过程

    现在,我们将深入探讨`get_random_data`模块的详细推导过程及其各个参数的作用。 首先,`get_random_data`的主要任务是对输入图像进行以下操作: 1. **随机裁剪(Random Cropping)**:为了增加模型对不同尺度目标...

    random walk_random_matalb_

    碰撞的添加意味着在随机游走过程中考虑了粒子与其他物体的相互作用,这可能涉及到碰撞检测算法,以及碰撞后的新移动方向计算。 总结来说,“random walk_random_matalb_”这一主题涵盖的是用Matlab实现的随机游走...

    Randomjs一个js的随机数生成器比Mathrandom兼容性更好且拥有更多特性

    Random.js 是一个专门为...在实际项目中,比如创建随机地图、模拟复杂系统、生成随机用户数据等,Random.js都能发挥重要作用。总的来说,这个库是JavaScript开发者的强大工具,丰富了他们在处理随机数问题时的选择。

    基于Random walker 的图像分割

    ### 基于Random Walker的图像分割技术 #### 概述 本文介绍了一种新颖的交互式多标签图像分割方法——基于随机游走(Random Walker)的图像分割算法。...随着计算机视觉技术的不断发展,未来有望在更多领域发挥重要作用。

    Random Vibrations.pdf

    综上所述,文档《Random Vibrations.pdf》深入探讨了随机振动分析对于理解和评估工程结构和机械系统在复杂环境下的性能和安全性的核心作用,提供了分析方法和理论工具,对于相关领域的工程师和研究人员具有重要的...

    ed.rar_random_random walk

    标题 "ed.rar_random_random walk" 暗示我们关注的主题是关于随机漫步(Random Walk)的模拟,可能涉及布朗运动(Browian Motion),这是一种在物理学和数学中常见的随机过程。在这个程序中,用户可以模拟不同类型的...

    Python之random库生成随机数

    除了Python的`random`库,`numpy`库也提供了强大的随机数生成功能,特别适合在科学计算和数据分析中使用。 `numpy.random.randn(a, b)`函数生成一个a行b列的二维数组,数组中的每个元素都服从标准正态分布(均值为0...

    matlab开发-RandomIntegerGenerator

    本项目提供的`rand_int.m`文件就是实现这一功能的核心代码,而`license.txt`文件则可能包含了关于该函数的使用许可信息。 在`rand_int.m`文件中,我们可以预见到它应该包含一个函数定义,该函数接受三个参数:`A`...

    SAMPLING, INTERPOLATION, AND RANDOM

    综上所述,采样、插值和随机脉冲列的生成在电信系统的设计与分析中起着至关重要的作用。无论是通过离散采样还是脉冲采样,亦或是随机机制生成脉冲列,都是为了更好地理解和控制通信过程中的信号传输。这些技术和理论...

    np.random.seed() 的使用详解

    这篇详解将深入探讨`np.random.seed()`的使用及其参数的作用。 首先,`np.random.seed()`的主要作用是确保随机数生成的可重复性。在进行实验、测试或者数据分析时,我们可能需要在不同的时间或环境中得到同样的...

Global site tag (gtag.js) - Google Analytics