4. Java 获取随机数

前言

本系列为Java后端服务面试题,若有错误或需要补充的内容,欢迎评论区留言


一、Math.random()

Math.random()是 Java中最基本的随机数生成方法,不需要实例化对象可以直接调用。该方法回返回一个[0,1)之间的双精度浮点数。此方法通常用于生成简单的随机数。

1.获取基本随机数

double randomNumber = Math.random();
System.out.println(randomNumber); // 输出介于0.0到1.0之间的随机数

2.生成范围内的随机数

int min = 10;
int max = 100;

// 口诀 :Math.random()*(最大值-最小值+1) + 最小值
int random = (int)(Math.random()*((max - min)+1) + min;
System.out.println(random); // 输出介于1到100之间的随机整数

二、Random类

Random类位于java.util包中。与Math.random()相比,Random类提供了更多的控制和灵活性,可以生成不同类型的随机数(包括整型,浮点型,布尔值),并且支持自定义随机数种子(seed)。

1.创建Random实例

Random random = new Random();  // 默认种子基于当前时间

或者,你也可以指定一个种子(seed),使得生成的随机数可预测:

Random randomWithSeed1 = new Random(12345);  // 使用固定种子 12345
Random randomWithSeed2 = new Random(12345);  // 使用固定种子 12345

注意:如果使用相同的种子生成Random对象,每次生成的随机数序列都会相同,这可用于于测试或需要可重复的随机序列。

PS.在《神秘博士》第十季第6集《Extremis》中,博士被引导进入一个名为“虚拟宇宙”的世界。这个世界看似真实,但其实是一个高度精密的虚拟现实,专门用来模拟宇宙中的人类和其他生命形式。博士太过强大,这虚拟现实世界就是为了模拟对付博士而创造。这世界有一本名为《Veritas》的书,这本书详细描述了某个虚拟世界的存在,揭露了这个虚拟世界的真理,而其中的科学家、学者在阅读这本书后由于无法接受这个事实而自杀。如何证明身处的世界时虚拟的?虚拟现实中的博士的同伴bill误入到科学家的“最后的晚宴”中,科学家告诉了bill真相,正常逻辑每个人想的随机数字都会不一样,但是他们却异口同声的说出了相同的随机数,下一个随机数又是一样,next!还是一样...换句话说他们的随机数序列都是相同的,也就说他们有相同的种子感兴趣的同学可以去看下这部剧《神秘博士》。

2.常见方法

Random类提供了多种方法可以生成不同类型的随机数,以下是一些常用的方法:

2.1 随机整数  nextInt()

生成一个随机整数,包括负整数、零、正整数。

int randomInt = rand.nextInt();  // 生成一个随机整数

随机整数 nextInt(int bound)
生成一个[0,bound)之间的整数,bound必须是正整数。

int randomInt = rand.nextInt(10);  // 生成 0 到 9 之间的随机整数

随机长整型数  nextLong()
生成一个随机的 long 类型的整数

long randomLong = rand.nextLong();// 输出一个随机 long 类型的整数,例如:-91203812923104
2.2 随机浮点数 (nextDouble())

生成一个[0.0, 1.0)之间的浮点数

double randomDouble = rand.nextDouble(); // 输出一个 0 到 1 之间的随机浮点数,例如:0.837957

随机浮点数 (nextFloat()) 
生成一个[0.0, 1.0)之间的浮点数,返回类型是float

float randomFloat = rand.nextFloat();// 输出一个 0 到 1 之间的随机浮点数,例如:0.36492
2.3 随机布尔值 (nextBoolean())

生成一个随机的布尔值返回true 或 false

boolean randomBool = rand.nextBoolean(); // 输出 true 或 false
2.4 生成符合高斯分布的随机数 nextGaussian()

生成一个符合标准正分布(均值为0,标准差为1)的随机数。

double gaussian = rand.nextGaussian();// 输出一个符合高斯分布的随机数,例如:-1.321

三、ThreadLocalRandom

ThreadLocalRandom类专为多线程环境设计的随机数生成器,它为每个线程提供独立的随机数生成器。ThreadLocalRandom类不能直接实例化,ThreadLocalRandom.current() 获取当前线程的 ThreadLocalRandom 实例,然后调用相应的生成随机数的方法。

适合场景:多线程环境下频繁生成随机数,尤其是在并行处理、分布式计算、游戏开发和模拟等应用场景中。

1.获取当前线程的实例

ThreadLocalRandom random = ThreadLocalRandom.current();

2.常见方法

2.1 生成一个随机整数
int randomInt = ThreadLocalRandom.current().nextInt();  // 生成任意整数
int randomIntInRange = ThreadLocalRandom.current().nextInt(0, 100);  // 生成一个范围在 [0, 100) 的整数
2.2 生成一个随机长整型数
long randomLong = ThreadLocalRandom.current().nextLong();  // 生成一个随机长整型数
long randomLongInRange = ThreadLocalRandom.current().nextLong(0, 1000);  // 生成一个范围在 [0, 1000) 的长整型数
 2.3 生成一个随机浮动数(double 类型)
double randomDouble = ThreadLocalRandom.current().nextDouble();  // 生成一个 [0.0, 1.0) 范围内的随机浮动数
double randomDoubleInRange = ThreadLocalRandom.current().nextDouble(0.0, 100.0);  // 生成一个 [0.0, 100.0) 范围内的随机浮动数
2.4 生成一个随机布尔值
boolean randomBoolean = ThreadLocalRandom.current().nextBoolean();  // 生成一个随机布尔值 (true 或 false)
2.5 生成随机字节
byte[] randomBytes = new byte[10];
ThreadLocalRandom.current().nextBytes(randomBytes);  // 填充字节数组

四、SecureRandom类

SecureRandom类是Java中加密级别的随机数生成器,继承自Random类,位于java.security包中,用于生成强加密的随机数,适用于安全型要求较高的场景,例如http会话密钥,密码学,数字签名等。

特点:

  • 安全性:标准的 Random 类生成的随机数是伪随机的,基于一些初始种子(如系统时间),这使得其生成的随机数可以被逆向推测或者预测。
  • 不可预测性:SecureRandom 类通过使用系统中的加密算法(例如 SHA-1SHA-256 等)来生成不可预测的随机数,确保生成的随机数无法被攻击者预测或复现。​​​​​

1.创建SecureRandom实例

SecureRandom 的无参构造函数将根据系统环境自动选择一个加密级别的随机数生成算法。通常,它会选择一个高质量的加密算法,适应当前的安全需求。 

SecureRandom secureRandom = new SecureRandom();

SecureRandom 也允许通过指定一个种子(seed来初始化随机数生成器。种子可以是任何一个字节数组,通常在需要保证随机数序列可复现的场景下使用。

byte[] seed = "seed".getBytes();
SecureRandom secureRandomWithSeed = new SecureRandom(seed);

2.常见方法

2.1 生成一个随机整数
//生成一个随机的 int 类型数值。
int randomInt = secureRandom.nextInt();
// 生成 [0, 100) 之间的随机整数
int randomIntInRange = secureRandom.nextInt(100);
//生成一个随机的 long 类型数值。
long randomLong = secureRandom.nextLong();
2.2 生成一个随机浮点类型数值(double
//生成一个范围在 [0.0, 1.0) 之间的随机 double 类型数值。
double randomDouble = secureRandom.nextDouble();
2.3 填充字节数组,生成随机字节
byte[] byteArray = new byte[16];
secureRandom.nextBytes(byteArray);  // 生成一个 16 字节长度的随机字节数组
2.4 生成一个随机布尔值。
boolean randomBoolean = secureRandom.nextBoolean();

五、SplittableRandom类

SplittableRandom是Java8引入的新的随机数生成器,位于java.util包中,专为并行计算设计。SplittableRandom支持分裂操作,允许从一个随机数生成器中分裂出多个独立的随机数生成器。这些分裂后的生成器可以并行工作,从而避免了竞争和同步的开销,提高了性能。

1.创建SplittableRandom实例

无参构造方法,这种方式会使用一个自动生成的种子来初始化 SplittableRandom 实例。

SplittableRandom splittableRandom = new SplittableRandom();

指定种子构造,这种方式允许你指定一个种子,以保证生成的随机数序列的可复现性。

SplittableRandom splittableRandom = new SplittableRandom(long seed);

2.常见方法

2.1 生成一个随机整数
int randomInt = splittableRandom.nextInt();
//生成 [0, 100) 之间的随机整数
int randomIntInRange = splittableRandom.nextInt(100); 
//生成 [10, 100) 之间的随机整数
int randomIntInRange = splittableRandom.nextInt(10,100); 
//生成一个随机的 long 类型数值。
long randomLong = splittableRandom.nextLong();
2.2 生成一个随机浮点类型数值(double
//生成一个 [0.0, 1.0) 之间的随机浮动数。
double randomDouble = splittableRandom.nextDouble();
2.3 生成一个随机布尔值。
boolean randomBoolean = splittableRandom.nextBoolean();

总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值