`
破晓之刃
  • 浏览: 6035 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类

关于随机数类Random类的探讨

 
阅读更多

     在实际的项目开发过程中,经常需要使用到一些随机数值,例如登入的验证码,或者游戏中的概率问题等。在java.util

 

包中专门提供了和随机处理有关的类,这个类就是Random类,里面包含了各种随机数字的生成的相关方法。

     Random类中实现的随机算法是伪随机,即是有规则的随机。随机算法有个起源数字称为种子数(seed),在种子数的基础上进行一定的变换,从而产生需要的随机数字。但是需要注意的是相同的的种子数的Random对象,相同次数生成的随机数字是完全相同的。也就是说两个种子数相同的Random对象,第一次生成的随机数字完全相同,第二次生成的随机数字也完全相同。

 

 

下面介绍下Random类包含的两个构造方法

 

1、public Random()

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

如:Random r=new Random();

 

2、public Random(long seed)

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

如:Random r1=new Random(10);

 

需要注意的是:种子数只是随机算法的起源数字和生成数字的区间无关。

 

 

 

Random类中的各个方法生成的随机数对象都是均匀分布的。也就是说区间内部的数字生成的几率是均等的。下面Random类中的常用方法介绍。

 

1、public boolean nextBoolean()

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

2、public double nextDouble()

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

 

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

            Random r=new Random();

            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;

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

 

 

3、public int nextInt()

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

 

4、public int nextInt(int n)

该方法的作用是生成一个随机的int值,该值介于[0,n)的区间

a、生成任意整数

      int n1=r.nextInt(); 直接用nextInt方法即可

b、生成[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)

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

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

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

d、几率的实现

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

在前面的方法介绍中,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;

  }

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

 

5、public void setSeed(long seed)

该方法的作用是重新设置Random对象中的种子数。

 

 

 

关于Math类中的random方法

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

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

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

 

 

 

 

 

分享到:
评论

相关推荐

    random_random随机数_random_

    在这个名为"random_random随机数_random_"的程序中,我们将探讨如何在C++中生成不重复的随机数。 C++标准库中的 `&lt;random&gt;` 头文件为我们提供了丰富的随机数生成器工具。首先,我们需要包含这个头文件以使用其提供...

    unity 随机数random 工具

    本教程将深入探讨Unity中的随机数生成工具,特别是基于C#语言的`Random`类。 首先,让我们了解Unity中内置的`Random`类。这个类提供了一系列方法来生成不同类型的随机数,包括整数、浮点数以及在特定范围内的数值。...

    随机数类 c++实现 及随机数跑硬币的应用

    本篇文章将详细讲解如何利用C++实现一个随机数类,并探讨如何将其应用到模拟抛硬币这样的随机事件中。 首先,我们需要理解C++中的随机数生成机制。C++11引入了新的 `&lt;random&gt;` 头文件,提供了丰富的随机数生成器和...

    随机数类.zip

    这个“随机数类.zip”文件可能包含了关于如何在C#中使用随机数类的示例代码或者教程。现在,我们将深入探讨C#中的随机数生成及其相关知识点。 首先,C#内置了一个名为`System.Random`的类,用于生成伪随机数。这个...

    Random()随机数+随机切换图片

    本文将围绕“Random()随机数”和“随机切换图片”这两个核心概念进行深入探讨。 首先,让我们关注Java中的`Random()`类。在Java中,`java.util.Random`是一个用于生成各种随机数值的类。它可以生成整数、浮点数以及...

    c++ 可以输入条件的VC++随机数生成程序 random

    在这个“c++ 可以输入条件的VC++随机数生成程序 random”中,我们将探讨如何在C++中使用标准库来生成可控制的随机数,以及如何在VC++环境中实现这样的程序。 首先,C++标准库中的 `&lt;random&gt;` 头文件提供了生成...

    BAT批处理学习-数值计算-random随机数生成器.zip

    本文将深入探讨“BAT批处理学习-数值计算-random随机数生成器.zip”这个主题,以及如何在批处理脚本中创建随机数生成器。 批处理脚本是基于DOS命令行环境的文本文件,它包含了多个操作系统命令,通过运行这些命令来...

    Java产生随机数的两种方式

    本文将详细探讨Java中生成随机数的两种主要方法:`java.lang.Math.random()`静态方法和`java.util.Random`类。 首先,我们来看`java.lang.Math.random()`方法。这是一个静态方法,不需要实例化对象就可以直接调用。...

    Random—产生不同的随机数

    本篇将深入探讨`Random`类的使用,数组的初始化和操作,以及它们在学习Java中的重要性。 首先,`Random`类位于`java.util`包下,它提供了多种方法来生成不同类型的随机数。创建一个`Random`对象后,你可以通过调用...

    C语言笔记关于随机数的笔记

    本文将深入探讨C语言中的随机数生成及其应用。 首先,我们需要理解C语言如何生成随机数。C语言提供了`rand()`函数来生成一个非负整数的随机数。这个函数位于`&lt;stdlib.h&gt;`头文件中。然而,`rand()`函数每次程序运行...

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

    现在我们深入探讨如何在Flash中使用Random函数以及相关的应用。 首先,让我们了解基本的用法。在ActionScript中,你可以这样创建一个0到1之间的随机数: ```actionscript var randomNumber:Number = Math.random()...

    随机数c代码

    这里我们主要讨论的是“随机数c代码”,并结合给出的文件名来探讨相关知识点。 标题"随机数c代码"可能涉及到的是使用C语言编写随机数生成器的源代码。C语言标准库中的 `&lt;stdlib.h&gt;` 提供了 `rand()` 和 `srand()` ...

    java 随机数的资源

    通过实例化`Random`类,我们可以获取到一个随机数生成器,然后调用其方法来生成不同类型的随机数。例如,创建一个`Random`对象的基本语法如下: ```java Random random = new Random(); ``` 生成整数随机数的方法...

    java 求最大的随机数

    Java提供了`java.util.Random`类来生成随机数。下面我们将深入探讨如何在Java中生成随机数以及如何找到最大的随机数。 1. **创建Random对象**: 在Java中,`Random`类是用于生成随机数的基础。首先,我们需要创建...

    Java使用Random类生成随机数示例

    除了深入探讨Random类的用法外,本文还提到了一些在线工具,这些在线工具能够帮助用户快速生成随机数字和字符串,对于那些不希望在本地环境下编写代码的用户来说,这些工具是很好的选择。 除此之外,读者可以参考本...

    c# 随机数的产生

    总结起来,C#中的随机数生成主要依赖于`System.Random`类,通过不同的方法调用来满足各种随机数生成的需求。在实际编程中,可以根据具体场景灵活运用这些功能,为应用程序添加更多的随机性和不确定性。

    RandomUtils_随机数工具类_

    在Java中,`java.util.Random`类是最基础的随机数生成器,而`RandomUtils`类则提供了一些方便的静态方法,使得随机数的生成更加便捷。 `RandomUtils`类的一个常见应用场景是生成随机字符串。随机字符串通常用于测试...

    C# 随机数测试使用

    首先,我们需要了解`System.Random`类,它是C#中用于生成随机数的内置类。创建一个`Random`对象,我们就可以开始生成随机数了。例如: ```csharp Random random = new Random(); int randomNumber = random.Next();...

    随机数产生与读取

    同时,Android提供了`Random`类来生成随机数。 总之,随机数的生成和读取是编程中常见的操作。正确理解和使用这些功能对于实现各种功能至关重要,无论是在简单的脚本中还是在复杂的移动应用中。了解如何在不同编程...

    时间控制产生随机数

    Java提供了一些内置的类来生成随机数,如`java.util.Random`。我们可以创建一个`Random`对象,然后调用其`nextInt()`或其他方法来获取所需的随机数。例如,生成1到100之间的随机整数: ```java Random random = new...

Global site tag (gtag.js) - Google Analytics