在 Java 中生成不重复的随机数有多种方式。下面我将介绍三种常见的实现方式,并附上相应的示例代码以及可能用到的第三方库的 Maven 和 Gradle 依赖坐标。
这种方式是将所有可能的随机数放入一个集合中,然后每次生成一个随机数后从集合中移除,确保不会重复。
步骤流程:
示例代码:
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class UniqueRandomGenerator {
public static void main(String[] args) {
List<Integer> numbers = new ArrayList<>();
int min = 1;
int max = 100;
int count = 10;
for (int i = min; i <= max; i++) {
numbers.add(i);
}
Random random = new Random();
for (int i = 0; i < count; i++) {
int index = random.nextInt(numbers.size());
int randomNum = numbers.remove(index);
System.out.println(randomNum);
}
}
}
这种方式使用 Fisher-Yates 洗牌算法将所有可能的随机数进行随机排列,然后依次取出前 N 个数。
步骤流程:
示例代码:
import java.util.Arrays;
import java.util.Random;
public class UniqueRandomGenerator {
public static void main(String[] args) {
int min = 1;
int max = 100;
int count = 10;
int[] numbers = new int[max - min + 1];
for (int i = min; i <= max; i++) {
numbers[i - min] = i;
}
Random random = new Random();
for (int i = numbers.length - 1; i > 0 && count > 0; i--) {
int index = random.nextInt(i + 1);
int temp = numbers[index];
numbers[index] = numbers[i];
numbers[i] = temp;
System.out.println(temp);
count--;
}
}
}
Apache Commons Lang 库中的 RandomUtils 类提供了生成不重复随机数的方法。这种方式利用了洗牌算法。
步骤流程:
RandomUtils
类的 nextInt
方法生成不重复随机数。示例代码:
import org.apache.commons.lang3.RandomUtils;
public class UniqueRandomGenerator {
public static void main(String[] args) {
int min = 1;
int max = 100;
int count = 10;
for (int i = 0; i < count; i++) {
int randomNum = RandomUtils.nextInt(min, max + 1);
System.out.println(randomNum);
}
}
}
Maven 依赖坐标:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version> <!-- Use the latest version -->
</dependency>
Gradle 依赖坐标:
implementation 'org.apache.commons:commons-lang3:3.12.0' // Use the latest version
以上是三种在 Java 中生成不重复随机数的方式,每种方式都有其特点和适用场景。选择合适的方法取决于你的需求和偏好。