파이썬(Python), 랜덤 기능 총정리와 실용적인 활용 예제

728x90

 

  • 실용적인 랜덤 기능 활용:
    • 안전한 비밀번호 생성을 위해 secrets 모듈을 사용
    • OTP(일회용 비밀번호) 생성 함수 구현
    • UUID를 사용한 고유 식별자 생성
  • 통계적 분포 활용:
    • 정규 분포, 지수 분포, 가우시안 분포 등 다양한 확률 분포에서 값 추출
    • 실제 통계 모델링, 시뮬레이션에 활용 가능
  • 랜덤 데이터 생성:
    • 날짜, 색상 등 실전에서 유용한 데이터 생성 함수
    • 테스트 데이터 생성에 활용 가능
  • 샘플링과 분포 시각화:
    • 가중치를 적용한 추첨 시뮬레이션
    • 실제 결과가 설정한 확률에 근접하는지 확인
  • 고급 랜덤 기능:
    • Fisher-Yates 알고리즘을 사용한 직접 셔플 구현
    • secrets 모듈을 활용한 보안 강화 랜덤 생성
    • NumPy 라이브러리를 활용한 대량 랜덤 데이터 생성
    • 시드 설정을 통한 재현 가능한 랜덤 생성
import random
import string
import secrets
import numpy as np
from datetime import datetime

print("===== 1. 실용적인 랜덤 기능 활용 =====")

# 비밀번호 생성기
def generate_password(length=12):
    # 대소문자, 숫자, 특수문자 포함
    characters = string.ascii_letters + string.digits + "!@#$%^&*()"
    # 보안 강화를 위해 secrets 모듈 사용
    password = ''.join(secrets.choice(characters) for _ in range(length))
    return password

print(f"랜덤 비밀번호: {generate_password()}")
print(f"16자리 비밀번호: {generate_password(16)}")

# OTP 생성기
def generate_otp(length=6):
    # 숫자로만 구성된 OTP
    return ''.join(str(random.randint(0, 9)) for _ in range(length))

print(f"6자리 OTP: {generate_otp()}")
print(f"8자리 OTP: {generate_otp(8)}")

# 무작위 UUID 생성
import uuid
print(f"UUID: {uuid.uuid4()}")

print("\n===== 2. 통계적 분포 활용 =====")

# 정규 분포에서 값 추출
normal_values = [random.normalvariate(100, 15) for _ in range(10)]
print(f"정규 분포(평균 100, 표준편차 15): {normal_values}")

# 지수 분포에서 값 추출
exp_values = [random.expovariate(0.5) for _ in range(10)]
print(f"지수 분포(람다=0.5): {exp_values}")

# 가우시안 분포
gaussian_values = [random.gauss(0, 1) for _ in range(10)]
print(f"가우시안 분포(평균 0, 표준편차 1): {gaussian_values}")

print("\n===== 3. 랜덤 데이터 생성 =====")

# 랜덤 날짜 생성
def random_date(start_year=2020, end_year=2023):
    year = random.randint(start_year, end_year)
    month = random.randint(1, 12)
    # 월에 따라 일수 다르게 설정
    max_day = 31 if month in [1, 3, 5, 7, 8, 10, 12] else 30
    if month == 2:
        max_day = 29 if year % 4 == 0 else 28
    day = random.randint(1, max_day)
    return datetime(year, month, day)

print(f"랜덤 날짜: {random_date()}")
print(f"랜덤 날짜 (2000-2010): {random_date(2000, 2010)}")

# 랜덤 색상 생성
def random_color():
    # RGB 형식 색상 생성
    r = random.randint(0, 255)
    g = random.randint(0, 255)
    b = random.randint(0, 255)
    return f"#{r:02x}{g:02x}{b:02x}"

print(f"랜덤 색상 코드: {random_color()}")

print("\n===== 4. 샘플링과 분포 시각화 =====")

# 가중 선택을 사용한 시뮬레이션
items = ["일등", "이등", "삼등", "꽝"]
weights = [0.01, 0.04, 0.15, 0.8]  # 일등 1%, 이등 4%, 삼등 15%, 꽝 80%

# 1000번 시뮬레이션 결과 집계
results = {}
for _ in range(1000):
    choice = random.choices(items, weights=weights, k=1)[0]
    results[choice] = results.get(choice, 0) + 1

print("추첨 시뮬레이션 결과:")
for item, count in results.items():
    print(f"{item}: {count}회 ({count/10}%)")

print("\n===== 5. 고급 랜덤 기능 =====")

# 랜덤 셔플 함수 직접 구현 (Fisher-Yates 알고리즘)
def custom_shuffle(items):
    n = len(items)
    for i in range(n-1, 0, -1):
        j = random.randint(0, i)
        items[i], items[j] = items[j], items[i]
    return items

numbers = list(range(1, 11))
print(f"직접 구현한 셔플: {custom_shuffle(numbers.copy())}")

# secrets 모듈 - 보안 관련 랜덤 기능
secure_token = secrets.token_hex(16)  # 32자리 16진수 토큰
print(f"보안 토큰: {secure_token}")

# NumPy의 랜덤 기능
np_random = np.random.default_rng(seed=42)
np_array = np_random.integers(1, 100, size=10)
print(f"NumPy 랜덤 배열: {np_array}")

# 시드 설정과 재현성
random.seed(42)  # 고정 시드
print(f"시드 42로 생성한 랜덤 값: {random.random()}")
print(f"다시 생성한 값: {random.random()}")

random.seed(42)  # 같은 시드 다시 설정
print(f"시드 재설정 후 첫 값: {random.random()}")  # 첫 번째 값과 동일

 

 

728x90