Random类

本文详细介绍了JavaRandom类的使用,包括类的结构、种子数的影响、常用方法如nextInt、nextLong等,以及如何在密码生成器中生成包含大写字母、小写字母和数字的六位随机密码。还提及了JDK1.8中StreamAPI的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

任务描述

本关任务:掌握Random类以及Random类的使用。

相关知识

为了完成本关任务,你需要掌握:

1.Random类;

2.Random对象的生成;

3.Random类中的常用方法。

Random类

Random类位于java.util包下,Random类中实现的随机算法是伪随机,也就是有规则的随机。在进行随机时,随机算法的起源数字称为种子数(seed),在种子数的基础上进行一定的变换,从而产生需要的随机数字。

相同种子数的Random对象,相同次数生成的随机数字是完全相同的。也就是说,两个种子数相同的Random对象,第一次生成的随机数字完全相同,第二次生成的随机数字也完全相同。这点在生成多个随机数字时需要特别注意。

Random对象的生成

Random类包含两个构造方法,下面依次进行介绍:

 
  1. public Random()

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

 
  1. public Random(long seed)

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

示例代码:

 
  1. Random r = new Random();
  2. Random r1 = new Random(10);

再次强调:种子数只是随机算法的起源数字,和生成的随机数字的区间无关。

验证:相同种子数的Random对象,相同次数生成的随机数字是完全相同的。

 
  1. package educoder;
  2. import java.util.Random;
  3. public class RandomTest {
  4. public void random() {
  5. int i = 0;
  6. int j = 0;
  7. Random random = new Random(1);
  8. Random random1 = new Random(1);
  9. i = random.nextInt();
  10. j = random1.nextInt();
  11. System.out.println("i:" + i + "\nj:" + j);
  12. }
  13. public static void main(String[] args) {
  14. RandomTest tt = new RandomTest();
  15. tt.random();
  16. }
  17. }

输出结果: 第一次: i:-1155869325 j:-1155869325

修改一下起源数字,让其等于100

 
  1. Random random = new Random(100);
  2. Random random1 = new Random(100);

输出结果: i:-1193959466 j:-1193959466

Random类中的常用方法

Random类中的方法比较简单,每个方法的功能也很容易理解。需要说明的是,Random类中各方法生成的随机数字都是均匀分布的,也就是说区间内部的数字生成的几率是均等的。下面对这些方法做一下基本的介绍:

 
  1. package educoder;
  2. import java.util.Random;
  3. public class RandomTest {
  4. public static void main(String[] args) {
  5. Random random = new Random();
  6. System.out.println("nextInt():" + random.nextInt()); // 随机生成一个整数,这个整数的范围就是int类型的范围-2^31~2^31-1
  7. System.out.println("nextLong():" + random.nextLong()); // 随机生成long类型范围的整数
  8. System.out.println("nextFloat():" + random.nextFloat()); // 随机生成[0, 1.0)区间的小数
  9. System.out.println("nextDouble():" + random.nextDouble()); // 随机生成[0, 1.0)区间的小数
  10. System.out.println("nextBoolean():"+random.nextBoolean());//随机生成一个boolean值,生成true和false的值几率相等,也就是都是50%的几率
  11. System.out.println("nextGaussian():"+random.nextGaussian());//随机生成呈高斯(“正态”)分布的 double 值,其平均值是 0.0,标准差是 1.0
  12. byte[] byteArr = new byte[5];
  13. random.nextBytes(byteArr); // 随机生成byte,并存放在定义的数组中,生成的个数等于定义的数组的个数
  14. System.out.print("nextBytes():");
  15. for (int i = 0; i < byteArr.length; i++) {
  16. System.out.print(byteArr[i]+"\t");
  17. }
  18. System.out.println();
  19. /**
  20. * random.nextInt(n)
  21. * 随机生成一个正整数,整数范围[0,n),包含0而不包含n
  22. * 如果想生成其他范围的数据,可以在此基础上进行加减
  23. *
  24. * 例如:
  25. * 1. 想生成范围在[0,n]的整数
  26. * random.nextInt(n+1)
  27. * 2. 想生成范围在[m,n]的整数, n > m
  28. * random.nextInt(n-m+1) + m
  29. * random.nextInt() % (n-m) + m
  30. * 3. 想生成范围在(m,n)的整数
  31. * random.nextInt(n-m+1) + m -1
  32. * random.nextInt() % (n-m) + m - 1
  33. * ......主要是依靠简单的加减法
  34. */
  35. System.out.println("nextInt(10):" + random.nextInt(10)); // 随机生成一个整数,整数范围[0,10)
  36. for (int i = 0; i < 5; i++) {
  37. System.out.println("我生成了一个[3,15)区间的数,它是:" + (random.nextInt(12) + 3));
  38. }
  39. /**
  40. * random.nextDouble()
  41. * 例如:
  42. * 1.生成[0,1.0)区间的小数
  43. * double d1 = random.nextDouble();//直接使用nextDouble方法获得。
  44. * 2.生成[0,5.0)区间的小数
  45. * double d2 = random.nextDouble() * 5;//因为扩大5倍即是要求的区间。同理,生成[0,d)区间的随机小数,d为任意正的小数,则只需要将nextDouble方法的返回值乘以d即可。
  46. * 3.生成[1,2.5)区间的小数
  47. * double d3 = r.nextDouble() * 1.5 + 1;//生成[1,2.5)区间的随机小数,则只需要首先生成[0,1.5)区间的随机数字,然后将生成的随机数区间加1即可。
  48. * ......同理,生成任意非从0开始的小数区间[d1,d2)范围的随机数字(其中d1不等于0),则只需要首先生成[0,d2-d1)区间的随机数字,然后将生成的随机数字区间加上d1即可。
  49. *
  50. */
  51. }
  52. }

输出结果: nextInt():1842341002 nextLong():4006643082448092921 nextFloat():0.88948154 nextDouble():0.5635189241159165 nextBoolean():false nextGaussian():1.3191426544832998 nextBytes():36 100 94 14 -98 nextInt(10):1 我生成了一个[3,15)区间的数,它是:5 我生成了一个[3,15)区间的数,它是:10 我生成了一个[3,15)区间的数,它是:10 我生成了一个[3,15)区间的数,它是:11 我生成了一个[3,15)区间的数,它是:6

JDK1.8新增方法:

 
  1. package educoder;
  2. import java.util.Random;
  3. public class RandomTest2 {
  4. /**
  5. * 测试Random类中 JDK1.8提供的新方法 JDK1.8新增了Stream的概念 在Random中,为double, int,
  6. * long类型分别增加了对应的生成随机数的方法 鉴于每种数据类型方法原理是一样的,所以,这里以int类型举例说明用法
  7. */
  8. public static void main(String[] args) {
  9. Random random = new Random();
  10. random.ints(); // 生成无限个int类型范围内的数据,因为是无限个,这里就不打印了,会卡死的......
  11. random.ints(10, 100); // 生成无限个[10,100)范围内的数据
  12. /**
  13. * 这里的toArray 是Stream里提供的方法
  14. */
  15. int[] arr = random.ints(5).toArray(); // 生成5个int范围类的整数。
  16. System.out.println(arr.length);
  17. for (int i = 0; i < arr.length; i++) {
  18. System.out.println(arr[i]);
  19. }
  20. // 生成5个在[10,100)范围内的整数
  21. arr = random.ints(5, 10, 100).toArray();
  22. for (int i = 0; i < arr.length; i++) {
  23. System.out.println(arr[i]);
  24. }
  25. /**
  26. * 对于 random.ints(); random.ints(ori, des);
  27. * 两个生成无限个随机数的方法,我们可以利用Stream里的terminal操作,来截断无限这个操作
  28. */
  29. // limit表示限制只要5个,等价于random.ints(5)
  30. arr = random.ints().limit(5).toArray();
  31. System.out.println(arr.length);
  32. for (int i = 0; i < arr.length; i++) {
  33. System.out.println(arr[i]);
  34. }
  35. // 等价于random.ints(5, 10, 100)
  36. arr = random.ints(10, 100).limit(5).toArray();
  37. for (int i = 0; i < arr.length; i++) {
  38. System.out.println(arr[i]);
  39. }
  40. }
  41. }

输出结果: 5 1801462452 -1812435985 -1073912930 1160255210 -1342018704 80 54 16 67 82 5 -1161610558 283052091 797550518 -275356995 -1661722790 11 27 27 52 54

编程要求

请仔细阅读右侧代码,根据方法内的提示,在Begin - End区域内进行代码补充,具体任务如下:

  • 设计一个密码的自动生成器:密码由大写字母/小写字母/数字组成,生成六位随机密码。

  • 分别以123作为种子数创建Random对象,生成六位随机密码进行测试。

  • 具体输出要求请看测试说明。

测试说明

补充完代码后,点击测评,平台会对你编写的代码进行测试,当你的结果与预期输出一致时,即为通过。

测试输入: 1 预期输出: NAvZuG


package case4;
//密码的自动生成器:密码由大写字母/小写字母/数字组成,生成六位随机密码
import java.util.Random;
import java.util.Scanner;
public class RandomTest {
	public static void main(String[] args) {
		// 定义一个字符型数组
		char[] pardStore = new char[62];
		// 把所有的大写字母放进去 把所有的小写字母放进去 把0到9放进去
		/********* Begin *********/
          for(int i=0;i<26;i++)
		{
			pardStore[i]=(char)('A'+i);
			pardStore[26+i]=(char)('a'+i);
		}
		for(int i=0;i<10;i++)
		{
			pardStore[52+i]= (char)('0' + i);
		}
		/********* End *********/
		// 分别以1、2、3作为种子数 生成6位随机密码
		Scanner sc = new Scanner(System.in);
		int seed = sc.nextInt();
		/********* Begin *********/
         Random r=new Random(seed);
		String str="";
		int[] arr=r.ints(6,0,62).toArray();
		for(int i=0;i<6;i++)
		{
			str+=pardStore[arr[i]];
		}
		System.out.print(str);
		/********* End *********/
	}
}

### 关于 Python 中 `random` 模块中的 `uniform` 方法 Python 的 `random` 模块提供了多种生成随机数的方法,其中包括 `random.uniform(a, b)`。此方法用于生成一个指定范围 `[a, b]` 内的浮点数。具体而言: - 如果 `a < b`,则返回的随机数满足条件:`a <= n <= b`[^1]。 - 如果 `a > b`,则返回的随机数满足条件:`b <= n <= a`。 以下是使用 `random.uniform()` 的示例代码: ```python import random # 生成 [5.0, 10.0) 范围内的随机浮点数 num = random.uniform(5.0, 10.0) print(f"Generated number between 5.0 and 10.0: {num}") ``` --- ### Java 中 `Random` 的基础用法 Java 提供了一个名为 `java.util.Random` 的来生成伪随机数。其主要功能通过两种构造器实现: #### 构造器说明 - **无参构造器** (`public Random()`) 此构造器会基于当前系统的相对时间戳生成一个种子值,并以此初始化 `Random` 对象[^2]。 - **带参数构造器** (`public Random(long seed)`) 用户可以显式提供一个种子值来创建 `Random` 实例。这使得每次运行程序时产生的序列相同(只要种子一致),这对于调试非常有用。 下面是具体的实例演示: ```java import java.util.Random; public class Main { public static void main(String[] args) { // 使用默认种子值 Random rDefaultSeed = new Random(); // 显式设置种子值 long customSeed = System.currentTimeMillis(); // 或者其他固定值 Random rCustomSeed = new Random(customSeed); // 随机整数 [-3, 15) int num1 = rDefaultSeed.nextInt(18) - 3; System.out.println("Random integer from -3 to 15 (exclusive): " + num1); // 另一种方式生成相同的区间 int num2 = Math.abs(rDefaultSeed.nextInt() % 18) - 3; System.out.println("Another way of generating the same range: " + num2); } } ``` 上述代码展示了如何利用 `nextInt(int bound)` 和数学运算生成特定区间的随机整数[^4]。 --- ### 结合 PyTorch 数据增强中的应用案例 在深度学习框架 PyTorch 中,数据预处理模块也经常涉及随机操作。例如,在图像裁剪过程中可能会调用似的随机机制。下面是一个简单的例子,展示如何定义随机裁剪变换并应用于输入张量[^3]: ```python from torchvision import transforms as T class CustomTransform: def __init__(self, crop_size, upscale_factor): self.crop_transform = T.RandomCrop(crop_size // upscale_factor) def apply_crop(self, image_tensor): cropped_image = self.crop_transform(image_tensor) return cropped_image ``` 在此片段中,`T.RandomCrop` 是用来执行随机裁剪的一个工具,它接受目标尺寸作为参数,并自动完成位置的选择过程。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式Dora

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值