Java中产生随机数的方法主要有三种:

  1. new Random()
  2. Math.random()
  3. currentTimeMillis()

1. Random类

第一种需要借助java.util.Random类来产生一个随机数发生器,也是最常用的一种,构造函数有两个,Random()Random(long seed)

  • 第一个就是以当前时间为默认种子
  • 第二个是以指定的种子值进行。

种子就是产生随机数的第一次使用值,随机是通过一个函数,将这个种子的值转化为随机数空间中的某一个点上,并且产生的随机数均匀的散布在空间中。以后产生的随机数都与前一个随机数有关。

public static void main(String[] args) {
    Random rand = new Random();
    for (int i = 0; i < 10; i++) {
        System.out.println(rand.nextInt(100) + 1);
    }
}

获得指定位随机数

随机两位整数

rand.nextInt(90) + 10; 

生成随机三位数的代码为:

rand.nextInt(900) + 100;

获取指定范围随机数

生成区间 [64,128] 中随机值的代码为:

rand.nextInt(65)+ 64;

最终公式如下:

int randNumber = rand.nextInt(MAX - MIN + 1) + MIN;

randNumber 属于[MIN, MAX]

public void test1() {
    Random rand = new Random();
    int MAX = 100, MIN = 1;
    for (int i = 0; i < 10; i++) {
        System.out.print(rand.nextInt(MAX - MIN + 1) + MIN + " ");
    }
}
//62 100 76 96 80 66 67 10 55 16 

2. Math.random()

而第二种方法返回的数值是[0.0, 1.0)的double型数值,由于double类数的精度很高,可以在一定程度下看做随机数,借助(int)来进行类型转换就可以得到整数随机数了\

在这里我举个例子:生成一个[1,100]之间的随机数字。

num = (int)(Math.random()*100) + 1;

Math.random()生成的是一个[0.0,1.0)之间的小数0.xxxxxx… 先将小数点向后移动2位,然后强制转换成int型,只保留整数位的值,这时候值的范围是[0,99],两个边界同时扩大一个单位的值+1,范围就变成了[1,100]。

@Test
public void test2() {
    for (int i = 0; i < 10; i++) {
        int ran = (int) (Math.random() * 100 + 1);
        System.out.print(ran + " ");
    }
}
//25 68 30 33 35 65 32 78 27 85 

但是…

我现在改变要求我需要一个范围为[0,100]的随机数,用简单的话来说就是包括0包括100

这时候就会发现使用第一种方法很难凑成既包括0又包括100的范围。这种情况推荐使用第一种方法

3. 时间戳

这种方法在循环中连续产生随机数,由于是同一时间,产生的结果可能相同

至于第三种方法虽然不常用,但是也是一种思路。方法返回从1970年1月1日0时0分0秒(这与UNIX系统有关)到现在的一个long型的毫秒数,取模之后即可得到所需范围内的随机数。

@Test
public void test3() {
    int max = 100, min = 1;
    long randomNum = System.currentTimeMillis();
    int ran = (int) (randomNum % (max - min) + min);
    //循环同一时间会产生相同的数
    System.out.print(ran);
}
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐