ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] random 함수 정리: 난수 생성, 샘플링, 셔플 핵심 사용법
    업무 자동화/Python 2025. 12. 1. 21:40

    1. 기본 난수 생성 함수들

    1-1. random.random() — 0.0 이상 1.0 미만 실수

    import random
    
    for _ in range(3):
        print(random.random())
    • 반환 범위: [0.0, 1.0) (1.0은 포함되지 않음)
    • 균일 분포(Uniform Distribution)를 따르는 부동소수점 난수

    활용 예시:

    # 0~100 사이 임의의 실수
    x = random.random() * 100

    1-2. random.randint(a, b) — 양 끝 포함 정수

    import random
    
    print(random.randint(1, 6))  # 1~6 사이 정수 (주사위 예시)
    • 반환 범위: [a, b] (a, b 모두 포함)
    • “주사위 눈”, “랜덤 인덱스” 같은 정수 난수에 자주 사용

    randint(a, b)는 내부적으로 randrange(a, b+1)과 비슷하게 동작합니다.

    1-3. random.randrange(start, stop[, step]) — range 스타일 정수

    import random
    
    print(random.randrange(10))         # 0~9 중 하나
    print(random.randrange(1, 10))      # 1~9 중 하나
    print(random.randrange(0, 10, 2))   # 0, 2, 4, 6, 8 중 하나
    • range()와 같은 규칙을 따릅니다.
      • start 기본값 0
      • stop은 포함되지 않음
      • step 간격으로 값 선택

    정리:

    • 배열 인덱스나 특정 간격의 정수 값이 필요할 때 사용
    • randint보다 범위/간격 제어가 조금 더 유연함

    1-4. random.uniform(a, b) — 임의 구간의 실수

    import random
    
    print(random.uniform(1.0, 3.0))  # 1.0 이상 3.0 이하
    • [a, b] 또는 [b, a] 구간에서 실수 난수를 생성
    • 센서 값, 임의의 좌표, 임의의 길이 등 “연속적인 값”을 만들어야 할 때 사용

     

    2. 시퀀스를 다루는 random 함수들

    2-1. random.choice(seq) — 하나 뽑기

    import random
    
    items = ["apple", "banana", "cherry"]
    print(random.choice(items))
    • 리스트, 튜플, 문자열 등에서 원소 하나를 랜덤 선택
    • 비어 있는 시퀀스에 대해 호출하면 IndexError 발생

    2-2. random.choices(seq, k, weights=None) — 여러 개 뽑기 (중복 허용)

    import random
    
    items = ["red", "green", "blue"]
    
    print(random.choices(items, k=5))
    
    weights = [0.7, 0.2, 0.1]
    print(random.choices(items, weights=weights, k=10))
    • k 개수를 지정해 여러 개 선택, 중복 허용
    • weights 또는 cum_weights로 선택 확률 조정 가능

    2-3. random.sample(population, k) — 여러 개 뽑기 (중복 없이)

    import random
    
    numbers = list(range(1, 46))
    
    lotto = random.sample(numbers, 6)
    print(sorted(lotto))
    • population에서 서로 다른 원소 k개를 선택
    • klen(population)보다 클 수 없음

    2-4. random.shuffle(seq) — 리스트 섞기

    import random
    
    deck = list(range(1, 11))
    random.shuffle(deck)
    print(deck)
    • 전달한 리스트를 제자리(in-place) 에서 섞습니다.
    • 반환값은 None

     

    3. random.seed(x) — 재현 가능한 난수 시퀀스

    import random
    
    random.seed(42)
    print(random.random())
    print(random.random())
    
    random.seed(42)
    print(random.random())
    print(random.random())
    • 같은 seed 값을 주면, 같은 순서의 난수가 재생됩니다.
    • 실험 재현, 테스트 코드, 문서 예제 작성에 매우 유용합니다.

    실무 패턴:

    • 실험 재현이 중요 → 코드 초반에 한 번만 random.seed(고정값)
    • 유저마다 다른 결과를 원함 → seed를 건드리지 않고 기본값 사용

     

    4. 확률 분포 기반 random 함수들 (간단 소개)

    4-1. 정규 분포: random.normalvariate(mu, sigma), random.gauss(mu, sigma)

    import random
    
    mu = 0.0      # 평균
    sigma = 1.0   # 표준편차
    
    x = random.normalvariate(mu, sigma)
    y = random.gauss(mu, sigma)
    • 둘 다 정규 분포 난수 생성
    • 노이즈 추가, 실험 데이터 모의 생성 등에 활용

    4-2. 지수 분포: random.expovariate(lambd)

    import random
    
    lambd = 0.5  # rate (평균 간격 1 / lambd)
    
    x = random.expovariate(lambd)
    • 사건 사이 시간 간격 모델링 등에 사용

     

    5. 보안 관련 주의: random vs secrets

    import random
    import secrets
    • random:
      • 의사 난수 (PRNG) → 내부 상태 예측 가능
      • 보안용(비밀번호, 토큰 생성 등)으로 부적합
    • secrets:
      • 암호학적으로 안전한 난수
      • 보안 토큰, 인증 코드, 일회용 비밀번호 등에 사용

    간단 예시:

    import secrets
    import string
    
    alphabet = string.ascii_letters + string.digits
    password = "".join(secrets.choice(alphabet) for _ in range(12))
    print(password)
Designed by Tistory.