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
'프로그래밍 > 파이썬' 카테고리의 다른 글
파이썬(Python), filter() 함수를 활용한 간결하고 효율적인 데이터 필터링 기법 (0) | 2025.03.15 |
---|---|
파이썬(Python), 클로저와 람다를 활용한 함수형 데이터 검증 시스템 구현하기 (0) | 2025.03.15 |
파이썬(Python), 정규식으로 제어 문자와 불필요한 공백 제거하기 (0) | 2025.03.15 |
파이썬(python) dataclass 사용/활용 예제 (0) | 2025.03.15 |
파이썬(python), f 문자열 기초와 활용 예제 (0) | 2025.03.15 |