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

Python으로 랜덤 ID 생성하기: random 모듈 완벽 활용 가이드

프로젝트를 진행하다 보면 테스트용 샘플 데이터를 만들거나 비어 있는 컬럼을 채우기 위해 무작위(random) 데이터를 생성해야 하는 경우가 자주 있습니다. Python은 이러한 랜덤 데이터를 생성할 수 있는 다양한 방법을 제공하는데, 이 글에서는 그중 핵심적인 방법들을 하나씩 살펴보겠습니다.

Python random 모듈 기본 사용법

Python에 기본으로 포함되어 있는 random 모듈은 랜덤 데이터 생성의 핵심 라이브러리입니다. 별도의 설치 없이 import만 하면 바로 사용할 수 있습니다.

import random

가장 기본적인 함수인 random.random()을 실행해 보겠습니다.

import random
print("random.random()을 사용하면 어떤 값이 나올까요?")
print(random.random())

실행 결과

random.random()을 사용하면 어떤 값이 나올까요?
0.5306626723173611

같은 프로그램을 다시 실행하면 매번 다른 값이 출력됩니다.

random.random()을 사용하면 어떤 값이 나올까요?
0.5504289430397661

random 모듈의 핵심 특징

  • random()은 random 모듈의 가장 기본적인 함수입니다.
  • 모듈 내 거의 모든 함수가 내부적으로 random() 함수를 활용합니다.
  • random() 함수는 0.0 이상 1.0 미만 범위의 실수를 반환합니다.

랜덤 정수 생성하기

정수형 난수가 필요하다면 아래 두 함수를 사용하면 됩니다.

  • randint(a, b): a와 b를 포함한 범위에서 정수 하나를 반환
  • randrange(start, stop, step): 지정된 범위와 간격(step)에 따라 정수를 반환
from random import randint, randrange
print("랜덤 정수 출력:", randint(0, 20))
print("랜덤 정수 출력:", randrange(0, 20, 2))

실행 결과

랜덤 정수 출력: 15
랜덤 정수 출력: 4

리스트에서 요소 하나 무작위로 선택하기

회사명이 담긴 리스트가 있고, 그중 하나를 무작위로 뽑고 싶다면 random.choice()를 사용합니다.

import random
companies = ['RELIANCE', 'TCS', 'INFY', 'SBI', 'PNB', 'HDFC']
print('리스트에서 회사 무작위 선택:', random.choice(companies))

실행 결과

리스트에서 회사 무작위 선택: INFY

리스트에서 여러 개의 요소 무작위로 선택하기

여러 개의 요소를 중복 없이 뽑으려면 random.sample()을 사용합니다.

import random
companies = ['RELIANCE', 'TCS', 'INFY', 'SBI', 'PNB', 'HDFC']
print('리스트에서 3개 회사 무작위 선택:', random.sample(companies, 3))

실행 결과

리스트에서 3개 회사 무작위 선택: ['TCS', 'RELIANCE', 'INFY']

단, 리스트에 있는 요소 개수보다 많은 수를 추출하려고 하면 ValueError가 발생합니다.

random.sample(companies, 20)
ValueError: Sample larger than population or is negative

반면 random.choices()는 중복을 허용하면서 원하는 개수만큼 추출할 수 있습니다.

import random
companies = ['RELIANCE', 'TCS', 'INFY', 'SBI', 'PNB', 'HDFC']
print('리스트에서 6개 회사 무작위 선택:', random.choices(companies, k=6))

실행 결과

리스트에서 6개 회사 무작위 선택: ['TCS', 'TCS', 'INFY', 'HDFC', 'INFY', 'TCS']

출력 결과에서 확인할 수 있듯이, choices()는 같은 요소가 중복해서 나타날 수 있다는 점에 유의해야 합니다.

시드(Seed)를 활용한 의사 난수 생성기

의사 난수 생성기(Pseudo-random Number Generator)는 이전에 생성된 값을 기반으로 일련의 연산을 수행하여 다음 값을 만들어냅니다. 처음에는 이전 값이 없기 때문에 시드(seed)라는 초기값을 설정하게 되는데, 같은 시드를 사용하면 항상 동일한 순서의 난수가 생성됩니다.

import random
print("시드 값 10:")
random.seed(10)
for i in range(5):
    print(random.randint(1, 100))

print()
print("시드 값 5:")
random.seed(5)
for i in range(5):
    print(random.randint(1, 100))

print()
print("시드 값 10 (재설정):")
random.seed(10)
for i in range(5):
    print(random.randint(1, 100))

실행 결과

시드 값 10:
74
5
55
62
74

시드 값 5:
80
33
95
46
89

시드 값 10 (재설정):
74
5
55
62
74

위 예제에서 볼 수 있듯이, 동일한 시드 값은 항상 동일한 난수 시퀀스를 생성합니다. 즉, 각 시드 값은 특정 난수 생성기에 대해 고정된 값의 순서와 대응됩니다. 이 성질은 테스트 결과를 재현해야 할 때 매우 유용합니다.

암호학적으로 안전한 난수 생성하기

보안이 중요한 작업(토큰 생성, 비밀번호 초기화 등)에는 일반 random 모듈 대신 암호학적으로 안전한(cryptographically secure) 난수 생성기를 사용해야 합니다.

Python 3.6 이상: secrets 모듈

Python 3.6부터 제공되는 secrets 모듈을 사용하면 안전한 난수를 간단히 생성할 수 있습니다.

import secrets
# 10과 500 사이의 안전한 난수 10개 생성
for x in range(0, 10):
    secV = 10 + secrets.randbelow(500)
    print(secV)

실행 결과

464
406
184
293
399
332
495
292
118
134

Python 3.5 이하: SystemRandom 클래스

구버전 Python에서는 random 모듈의 SystemRandom 클래스를 활용할 수 있습니다. 이 클래스는 운영체제가 제공하는 암호학적 엔트로피 소스를 사용합니다.

import random
randGen = random.SystemRandom()
for x in range(0, 10):
    secV = 10 + randGen.randint(0, 499)
    print(secV)

실행 결과

374
211
425
264
217
97
210
39
319
52

secrets와 random을 함께 활용하기

안전한 실수형 난수와 바이트 토큰이 필요하다면 두 모듈을 조합해 사용할 수도 있습니다.

import secrets
import random
secNum = random.SystemRandom().random()
print("안전한 난수:", secNum)
print("안전한 바이트 토큰:", secrets.token_bytes(16))

실행 결과

안전한 난수: 0.5205307353786663
안전한 바이트 토큰: b'\x05T>\xacsqn0\x08\xc4\xf4\x8aU\x13\x9f\xcf'

마무리

지금까지 Python에서 랜덤 데이터를 생성하는 다양한 방법을 살펴보았습니다. 상황에 맞게 정리하면 다음과 같습니다.

  • 일반적인 용도: random 모듈의 random(), randint(), choice(), sample(), choices()
  • 재현 가능한 테스트 데이터: seed()로 고정된 난수 시퀀스 생성
  • 보안 관련 작업: secrets 모듈 또는 SystemRandom 클래스

목적에 맞는 도구를 선택하면 테스트 데이터 생성, 샘플링, 보안 토큰 발급 등 다양한 작업을 효율적으로 처리할 수 있습니다.