1. 概述

生成随机数是编程中的常见任务,主要用于模拟、测试和游戏开发。本文将介绍多种使用伪随机数生成器填充数组内容的方法,涵盖不同场景下的最佳实践。

2. 使用迭代方法

最直接的方式是通过循环迭代填充数组。Java提供了多个伪随机数生成类,适用于不同场景:

  • Random:通用随机数生成
  • SecureRandom:加密安全随机数
  • ThreadLocalRandom:多线程高效随机数

以下示例使用Random.nextInt()填充数组:

int LOWER_BOUND = 1;
int UPPER_BOUND = 100;
int ARRAY_SIZE = 10;
int[] arr = new int[ARRAY_SIZE];
// 随机数生成器
Random random = new Random();
// 迭代填充
for (int i = 0; i < arr.length; i++) {
    arr[i] = random.nextInt(LOWER_BOUND, UPPER_BOUND);
}

System.out.println(Arrays.toString(arr));

典型输出:

[31, 2, 19, 14, 93, 31, 78, 46, 9, 46]

✅ 关键点:

  • 定义了数组大小和数值范围
  • 使用nextInt(bound)生成指定范围随机数
  • 后续示例将保持相同参数

也可使用Math.random()实现类似效果:

int[] arr = new int[ARRAY_SIZE];
// 迭代填充
for (int i = 0; i < arr.length; i++) {
    arr[i] = (int) (Math.random() * (UPPER_BOUND - LOWER_BOUND)) + LOWER_BOUND;
}

System.out.println(Arrays.toString(arr));

输出示例:

[78, 9, 46, 39, 78, 90, 46, 79, 51, 25]

⚠️ 注意:Math.random()返回0.0(含)到1.0(不含)的double值,需手动转换类型和范围。

3. 使用Java Streams

Java 8+提供了更简洁的流式API。伪随机数生成类新增了ints()longs()doubles()方法,可直接生成随机数流。

示例使用Random.ints()填充数组:

// 随机数生成器
Random random = new Random();
// 使用ints方法填充
int[] arr = random.ints(ARRAY_SIZE, LOWER_BOUND, UPPER_BOUND).toArray();

System.out.println(Arrays.toString(arr));

输出示例:

[73, 75, 50, 92, 8, 6, 12, 41, 40, 85]

✅ 优势:

  • 避免显式循环
  • 链式调用简洁高效
  • 支持并行流处理

4. 使用Arrays.setAll()方法

Arrays.setAll()方法通过生成器函数填充数组,可与随机数生成器结合使用:

int[] arr = new int[ARRAY_SIZE];

// 填充内容
Arrays.setAll(arr, r -> new SecureRandom().nextInt(LOWER_BOUND, UPPER_BOUND));

System.out.println(Arrays.toString(arr));

输出示例:

[5, 30, 88, 28, 20, 86, 6, 74, 31, 80]

✅ 特点:

  • 函数式编程风格
  • 支持任意生成器逻辑
  • 线程安全(示例使用SecureRandom

5. 使用种子生成随机数

某些场景需要控制随机序列(如测试复现)。RandomSecureRandom支持设置种子值,但ThreadLocalRandom为性能考虑不支持此功能。

种子值影响:

  • 相同种子 → 相同随机序列
  • 不同种子 → 不同随机序列
  • 无种子 → 默认行为(每次不同)
// 重复生成相同序列
int[] arr = new Random(12345).ints(ARRAY_SIZE, LOWER_BOUND, UPPER_BOUND).toArray();

int[] arr2 = new Random(12345).ints(ARRAY_SIZE, LOWER_BOUND, UPPER_BOUND).toArray();

System.out.printf("Arr: %s%n", Arrays.toString(arr));
System.out.printf("Arr2: %s%n", Arrays.toString(arr2));

// 使用不同种子
int[] arr3 = new Random(54321).ints(ARRAY_SIZE, LOWER_BOUND, UPPER_BOUND).toArray();

System.out.printf("%nArr2: %s%n", Arrays.toString(arr2));
System.out.printf("Arr3: %s%n", Arrays.toString(arr3));

典型输出:

Arr: [95, 95, 7, 55, 68, 77, 8, 73, 26, 88]
Arr2: [95, 95, 7, 55, 68, 77, 8, 73, 26, 88]

Arr2: [95, 95, 7, 55, 68, 77, 8, 73, 26, 88]
Arr3: [22, 20, 39, 49, 86, 3, 83, 46, 98, 88]

✅ 应用场景:

  • 调试时复现问题
  • 单元测试固定数据
  • 模拟实验可重复性

⚠️ 注意:未设置种子或使用不同种子时,实际输出可能与示例不同(随机性导致)。

6. 结论

本文探讨了Java中填充随机数数组的四种主要方法:

  1. 迭代填充:最基础的方式,适合简单场景
  2. 流式API:Java 8+推荐,代码简洁高效
  3. **Arrays.setAll()**:函数式风格,灵活度高
  4. 种子控制:特殊场景下的可复现性需求

选择建议:

  • 通用场景 → Random + 流式API
  • 加密安全 → SecureRandom
  • 多线程 → ThreadLocalRandom
  • 测试复现 → 固定种子值

完整代码示例可在GitHub仓库获取。


原始标题:How to Fill an Array With Random Numbers | Baeldung