在Java中,随机数的概念从广义上将,有三种。
  1、通过System.currentTimeMillis()来获取一个当前时间毫秒数的long型数字。
  2、通过Math.random()返回一个0到1之间的double值。
  3、通过Random类来产生一个随机数,这个是专业的Random工具类,功能强大。

(int)(1+Math.random()*(10-1+1)) ----- 从1到10的int型随数

Random

需要说明的是,Random类中各方法生成的随机数字都是均匀分布的,也就是说区间内部的数字生成的几率是均等的。
Random r = new Random(); 没有给种子,用的是默认种子,是当前时间的毫秒值
Random r1 = new Random(10); 给出指定的种子
再次强调:种子数只是随机算法的起源数字,和生成的随机数字的区间无关。
在这里插入图片描述
无参:
同样的程序运行两次得到的结果并不相同,是因为在创建Random对象时没有传入种子参数,程序会自动以当前时间为时间戳。所以每一次的运行结果都是不同的。

import java.util.Random;
public class RandomTest{
	public static void main(String[] args)throws Exception{
        Random r=new Random();   //不传入种子
        for(int i=0;i<8;i++){
        	System.out.println(r.nextInt(100));
        }
	}
}

有参:
无论运行多少次,结果完全相同,那是因为创建Random对象时传入了参数,两次运行时种子相同。

import java.util.Random;
public class RandomTest{
	public static void main(String[] args)throws Exception{
        Random r=new Random(100);   //传入种子
        for(int i=0;i<8;i++){
        	System.out.println(r.nextInt(100));
        }
	}
}

Random中的方法

其中常用的:
Random类的nextDouble()方法返回的是0.0至1.0之间的double类型值。
nextFloat()方法返回的是0.0至1.0之间的float类型值。
nextInt(int n)返回的是0(包括)至n(不包括)之间的int值。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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对象相同。

技巧

使用 Math.abs() 限制随机数为非负数
选择哪种小数:
其中的nextFloat(),nextDouble()方法分别生成0-1的8位有限小数,16位有限小数的随机数。

案例应用

生成[0,d)区间的随机小数: random.nextDouble() * d;
生成[1,d)区间的随机小数: random.nextDouble() * d+1;
生成[5.0,8.0]区间的随机小数: random.nextDouble()*(8.0-5.0+0.1)+5.0;

Random r = new Random();

a、生成[0,1.0)区间的小数,直接使用nextDouble方法获得。
double d1 = r.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即可。

//nextDouble 范围:[0.0-1.0)  目标:[5.0-8.0)
double v = random.nextDouble() * 3 + 5;  //[0.0-3.0) + 5 = [5.0-8.0)
//  [0.0-1.0) +[0,2] + 5 = [5.0-8.0)
double v2 = random.nextDouble() + random.nextInt(3) + 5;//

在这里插入图片描述

d、生成任意整数

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

e、生成[0,10)区间的整数  以下两行代码均可生成[0,10)区间的整数。

int n2 = r.nextInt(10);  使用Random类中的nextInt(int n)方法直接实现。

n2 = Math.abs(r.nextInt() % 10);
第二种实现中,首先调用nextInt()方法生成一个任意的int数字,该数字和10取余以后生成的数字区间为(-10,10),然后再对该区间求绝对值,则得到的区间就是[0,10)了。

同理,生成任意[0,n)区间的随机整数,都可以使用如下代码:

int n2 = r.nextInt(n);
n2 = Math.abs(r.nextInt() % n);

f、生成[0,10]区间的整数等价于[0,11)

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开始的小数区间实现原理的说明。

Math.random()方法生成0.01.0(不包含1.0)double型随机数,一般地, a + Math.random() * b可以返回a到a+b之间的随机数,不包括a+b.

生成伪随机数并保存到数组中

 public static void main(String[] args) {
        Random random = new Random();
        //生成伪随机数并保存到数组中
        byte[] bs = new byte[5];
        random.nextBytes(bs);
        for (byte b : bs) {
            System.out.print(b + ", ");
        }

    }
nextLong()%n使其随机数区间在(-n,n)
输出(-10,10)的随机数
Long temp = rd.nextLong()%10;

其中的nextFloat(),nextDouble()方法分别生成0-18位有限小数,16位有限小数的随机数。
输出16位有限小数的随机数。
double temp = Math.abs( rd.nextDouble())%10;

在这里插入图片描述

在这里插入图片描述

其他随机数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐