어제 오늘 내일

[Java] 중복되지 않는 난수 생성하기 본문

IT/Java

[Java] 중복되지 않는 난수 생성하기

hi.anna 2025. 3. 20. 06:43

 

Java에서 중복되지 않는 난수 생성 방법

 

1. Set을 이용한 중복 제거 (빠르고 간단한 방법)

Set은 중복된 값을 자동으로 제거하므로, 중복 없는 난수를 생성하는 가장 간단한 방법입니다.

import java.util.HashSet;
import java.util.Random;
import java.util.Set;

public class UniqueRandomNumbers {
    public static void main(String[] args) {
        Random random = new Random();
        Set<Integer> uniqueNumbers = new HashSet<>();
        int min = 1, max = 100, count = 10; // 1~100 사이의 10개의 난수

        while (uniqueNumbers.size() < count) {
            int num = random.nextInt(max - min + 1) + min; // min ~ max 범위 난수
            uniqueNumbers.add(num);
        }

        System.out.println("중복되지 않는 난수: " + uniqueNumbers);
    }
}

출력 예시

중복되지 않는 난수: [27, 34, 58, 12, 79, 91, 43, 15, 86, 99]

설명

  • HashSet은 중복된 값을 자동으로 걸러줌.
  • 원하는 개수(count)만큼 난수를 얻을 때까지 반복.

 

2. List를 섞어서 중복 없는 난수 생성 (범위 내 모든 수를 무작위로 섞기)

난수를 생성하는 대신 숫자 리스트를 섞고 원하는 개수만큼 가져오는 방법입니다.

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class UniqueRandomShuffle {
    public static void main(String[] args) {
        int min = 1, max = 100, count = 10;
        List<Integer> numbers = new ArrayList<>();

        // 모든 숫자를 리스트에 추가
        for (int i = min; i <= max; i++) {
            numbers.add(i);
        }

        // 리스트 섞기 (Shuffle)
        Collections.shuffle(numbers);

        // 앞에서 count 개수만큼 가져오기
        List<Integer> result = numbers.subList(0, count);
        System.out.println("중복 없는 난수: " + result);
    }
}

출력 예시

중복 없는 난수: [72, 14, 28, 96, 41, 3, 55, 83, 67, 9]

설명

  1. 1~100까지의 모든 숫자를 리스트에 저장.
  2. Collections.shuffle()을 이용해 무작위로 섞음.
  3. subList(0, count)를 이용해 앞에서 count 개수만큼 선택.

 

3. Stream API를 이용한 중복 없는 난수 생성 (Java 8+)

Java 8부터는 Stream API를 이용하여 중복 없는 난수를 간단하게 생성할 수 있습니다.

import java.util.Random;
import java.util.stream.Collectors;

public class UniqueRandomStream {
    public static void main(String[] args) {
        int min = 1, max = 100, count = 10;
        Random random = new Random();

        List<Integer> uniqueNumbers = random.ints(min, max + 1)
                .distinct()
                .limit(count)
                .boxed()
                .toList();

        System.out.println("중복 없는 난수: " + uniqueNumbers);
    }
}

출력 예시

중복 없는 난수: [52, 27, 93, 14, 65, 71, 88, 49, 36, 79]

설명

  1. random.ints(min, max + 1) → min~max 범위의 무한 스트림 생성.
  2. .distinct() → 중복 제거.
  3. .limit(count) → 원하는 개수만큼 선택.
  4. .boxed() → int를 Integer로 변환
  5. .toList() → List<Integer> 타입으로 변환

 

 

4. SecureRandom을 이용한 보안성이 높은 중복 없는 난수 생성

보안이 중요한 환경에서는 SecureRandom을 사용해야 합니다.

import java.security.SecureRandom;
import java.util.HashSet;
import java.util.Set;

public class SecureRandomUniqueNumbers {
    public static void main(String[] args) {
        SecureRandom secureRandom = new SecureRandom();
        Set<Integer> uniqueNumbers = new HashSet<>();
        int min = 1, max = 100, count = 10;

        while (uniqueNumbers.size() < count) {
            int num = secureRandom.nextInt(max - min + 1) + min;
            uniqueNumbers.add(num);
        }

        System.out.println("보안 난수: " + uniqueNumbers);
    }
}

출력 예시

보안 난수: [43, 29, 87, 91, 14, 38, 62, 55, 7, 76]

 

 

 

반응형
Comments