Java中Random类的应用问题

来源:互联网 发布:talk软件下载 编辑:程序博客网 时间:2024/04/30 21:33

       在实际中调用Random(java.util)类的预算时,需要弄清楚Random中每个方法的调用方式是否可以使用。

       int nextInt() :返回下一个伪随机数,它是此随机数生成器的序列中均匀分布的 int 值。
       备注:生成一个随机的int值,该值介于[0,n)的区间,也就是0到n之间的随机int值,包含0而不包含n。

       int nextInt(int n) :返回一个伪随机数,它是取自此随机数生成器序列的、在 0(包括)和指定值(不包括)之间均匀分布的 int 值。

       nextBoolean() :返回下一个伪随机数,它是取自此随机数生成器序列的均匀分布的 boolean 值。

       nextBytes(byte[] bytes) :生成随机字节并将其置于用户提供的 byte 数组中。

       nextDouble() :返回下一个伪随机数,它是取自此随机数生成器序列的、在 0.0 和 1.0 之间均匀分布的 double 值。

       public void setSeed(long seed):重新设置Random对象中的种子数。设置完种子数以后的Random对象和相同种子数使用new关键字创建出的Random对象相同。

       对此相信大家对一个数很敏感,伪随机数这是一个在Java中怎么样的数值应用呢?

       在计算机学中,存在这样的三类数值:真随机数,准随机数,伪随机数。在此我们简单的介绍一下什么是伪随机数:通过某种数学公式或者算法产生的数值序列。虽然在数学意义上伪随机数是不随机的,但是如果能通过统计检测,可以当成真随机数使用。

       在实际中的应用上,将根据所需要的题目类型及条件进行判断。下面我将通过一个例子对nextInt进行的用法进行简单的介绍:

import java.util.Random;
public class RandomTest {
     public static void main(String[] args) {
      int max = 50;
     int min = 1;
     Random random = new Random();
      int s = random.nextInt(max) + min;
     System.out.println(s);
     }
}

     通过上面的例子可以得到一个[0,N)的开区间的范围,在此范围内就不能满足实际中的随机数的产生,需要在原本计算的范围增加一作为产生随机数的基本条件。

     通过查阅Java中API8版本的手册可以发现在调用nextInt()的时候进行以下的运算。

public int nextInt(int n) {
      if (n <= 0)
      throw new IllegalArgumentException(“n must be positive”);
      if ((n & -n) == n) // i.e., n is a power of 2
           return (int)((n * (long)next(31)) >> 31);
      int bits, val;
      do {
      bits = next(31);
      val = bits % n;
      } while (bits - val + (n-1) < 0);
      return val;
}

      下面开始就通过实际的例子清晰理解整个Random中常用的方法:
      Random R = new Random();
      1、生成[0,5.0)区间的小数
      double R2 = R.nextDouble() * 5;
      生成[0,R)区间的随机小数,R为任意正的小数,则只需要将nextDouble方法的返回值乘以R即可

      2、生产随机数;
     Random R = new Random();
     int n1 = R.nextInt();
     这次,直接采用nextInt()方法即可。直接产生随机数
     3、生成任意[0,n)区间的随机整数;
     int n2 = R.nextInt(n);
     n2 = Math.abs(R.nextInt() % n);强调内容

      3、生成[0,10]区间的整数
     Random R = new Random();
      int n3 = r.nextInt(11);
      n3 = Math.abs(r.nextInt() % 11);
      [0,10]区间和[0,11)区间等价,所以即生成[0,11)区间的整数。