Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python에서 중복 없는 난수 생성하기: 반복문 방식과 random.sample() 활용법

Python 프로그래밍을 하다 보면 특정 범위 내에서 중복되지 않는 난수를 여러 개 생성해야 하는 경우가 자주 발생합니다. 예를 들어 복권 번호 추첨, 퀴즈 문제 순서 섞기, 게임 아이템 랜덤 배치 등이 대표적인 예입니다.

이 글에서는 1부터 100 사이의 서로 다른 정수 10개를 생성하는 두 가지 방법을 소개합니다.

1. 반복문과 조건문을 이용한 기본 방법

가장 직관적인 방법은 주어진 구간에서 난수를 하나씩 생성하고, 이미 리스트에 존재하는 값이라면 추가하지 않는 것입니다. 리스트에 값이 10개가 될 때까지 반복하면 됩니다.

>>> import random
>>> numbers = []
>>> while len(numbers) < 10:
        r = random.randint(1, 100)
        if r not in numbers:
            numbers.append(r)

>>> print(numbers)
[13, 53, 25, 95, 64, 87, 27, 93, 74, 60]

이 코드는 random.randint(1, 100)으로 1~100 사이의 난수를 생성한 뒤, 해당 값이 리스트에 없을 경우에만 추가합니다. 원본 예제처럼 for 반복문을 사용할 수도 있지만, 중복된 값이 걸러지는 동안 실행 횟수가 늘어나므로 while 문으로 목표 개수를 명확히 지정하는 편이 더 안전합니다.

주의할 점

  • 생성하려는 난수 개수가 범위 크기를 초과하면 무한 루프에 빠질 수 있습니다. (예: 1~10 범위에서 11개 생성 시도)
  • 범위가 넓고 필요한 개수가 많을수록 중복 검사 비용이 커져 성능이 저하될 수 있습니다.

2. random.sample()로 간단하게 해결하기

Python 표준 라이브러리는 이 작업을 위한 전용 함수인 random.sample()을 제공합니다. 이 함수는 지정한 모집단에서 중복 없이 원하는 개수만큼 요소를 무작위로 추출해 줍니다.

>>> import random
>>> numbers = random.sample(range(1, 101), 10)
>>> print(numbers)
[42, 7, 89, 15, 63, 28, 91, 3, 56, 70]

range(1, 101)은 1부터 100까지의 숫자 집합을 의미하며, 두 번째 인자인 10은 추출할 개수입니다. 단 한 줄로 중복 없는 난수 목록을 얻을 수 있고, 내부적으로 최적화되어 있어 성능 면에서도 유리합니다.

정리

방법장점단점
반복문 + 조건문동작 원리를 이해하기 쉬움, 로직 커스터마이징 가능코드가 길고 성능 저하 가능성 있음
random.sample()코드가 간결하고 빠름, 중복 보장추출 개수가 모집단보다 크면 ValueError 발생

실무에서는 대부분 random.sample()을 사용하는 것이 권장됩니다. 다만 학습 목적이나 특수한 조건(예: 특정 규칙에 따라 재추출)이 필요하다면 반복문 방식도 유용하게 활용할 수 있습니다.