杰瑞科技汇

Java如何高效生成不重复随机数?

Java 随机生成不重复的数字

在Java中,有几种方法可以生成不重复的随机数字,以下是几种常用的实现方式:

Java如何高效生成不重复随机数?-图1
(图片来源网络,侵删)

方法1:使用Set集合(适用于小范围数字)

import java.util.HashSet;
import java.util.Random;
import java.util.Set;
public class UniqueRandomNumbers {
    public static void main(String[] args) {
        int count = 10; // 需要生成的随机数数量
        int max = 100;  // 随机数最大值
        Set<Integer> uniqueNumbers = new HashSet<>();
        Random random = new Random();
        while (uniqueNumbers.size() < count) {
            int num = random.nextInt(max) + 1; // 生成1到max之间的随机数
            uniqueNumbers.add(num);
        }
        System.out.println("生成的随机数: " + uniqueNumbers);
    }
}

方法2:使用Fisher-Yates洗牌算法(适用于大范围数字)

import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Random;
public class UniqueRandomNumbers {
    public static void main(String[] args) {
        int count = 10; // 需要生成的随机数数量
        int max = 100;  // 随机数最大值
        // 创建1到max的列表
        List<Integer> numbers = new ArrayList<>();
        for (int i = 1; i <= max; i++) {
            numbers.add(i);
        }
        // 打乱列表顺序
        Collections.shuffle(numbers, new Random());
        // 取前count个元素
        List<Integer> result = numbers.subList(0, count);
        System.out.println("生成的随机数: " + result);
    }
}

方法3:使用Java 8 Stream API

import java.util.Random;
import java.util.stream.Collectors;
public class UniqueRandomNumbers {
    public static void main(String[] args) {
        int count = 10; // 需要生成的随机数数量
        int max = 100;  // 随机数最大值
        List<Integer> uniqueNumbers = new Random()
            .ints(1, max + 1) // 生成1到max之间的随机数
            .distinct()       // 确保不重复
            .limit(count)     // 限制数量
            .boxed()          // 转为Integer
            .collect(Collectors.toList());
        System.out.println("生成的随机数: " + uniqueNumbers);
    }
}

方法4:使用ThreadLocalRandom(Java 7+)

import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.ThreadLocalRandom;
public class UniqueRandomNumbers {
    public static void main(String[] args) {
        int count = 10; // 需要生成的随机数数量
        int max = 100;  // 随机数最大值
        Set<Integer> uniqueNumbers = new HashSet<>();
        while (uniqueNumbers.size() < count) {
            int num = ThreadLocalRandom.current().nextInt(1, max + 1);
            uniqueNumbers.add(num);
        }
        System.out.println("生成的随机数: " + uniqueNumbers);
    }
}

注意事项

  1. 当需要的随机数数量接近随机数范围大小时(如需要95个1-100的随机数),前几种方法效率会降低
  2. 对于大范围数字生成,方法2(Fisher-Yates)更高效
  3. 如果需要加密安全的随机数,应使用SecureRandom而不是Random

选择哪种方法取决于你的具体需求,特别是需要生成的随机数数量和范围。

Java如何高效生成不重复随机数?-图2
(图片来源网络,侵删)
分享:
扫描分享到社交APP
上一篇
下一篇