더북(TheBook)

카드 셔플링 다음 코드는 카드들을 서로 뒤섞는다.

n = len(deck)
for i in range(n):
    r = random.randrange(i, n)
    temp = deck[r]
    deck[r] = deck[i]
    deck[i] = temp

이 코드는 왼쪽에서 시작해 deck[i]deck[n-1] 사이에 있는 카드를 하나 골라 deck[i]와 서로 바꾼다. 이 코드는 보기보다 복잡하다. 첫째, 두 변수의 교환 코드를 이용해 섞고 난 후의 카드가 섞기 전 카드와 똑같은 카드 한 벌임을 보장한다. 둘째, 아직 선택하지 않은 카드들 중에서 균등 분포 난수를 이용해 선택한 카드와 교환함을 보장한다. 그런데 파이썬에서는 주어진 배열을 균일하게 뒤섞어주는 함수로서 random 모듈에 shuffle()이라는 함수가 있다. 따라서 앞에서 작성한 코드를 간단히 random.shuffle(deck) 한 줄로 바꿀 수 있다.

배열을 변경하지 않고 샘플링하기 어떤 집합에서 무작위로 샘플을 추출하는 것을 원하는 경우가 종종 있다. 샘플에는 각 요소가 최대 한 번만 나타날 수 있다. 예를 들어 바구니 안에 숫자를 매긴 탁구공을 꺼내거나 카드 패를 돌릴 때가 이런 경우이다. [프로그램 1.4.1](sample.py)은 카드를 섞을 때 사용한 기본 연산을 이용해 샘플을 추출하는 연산을 보여준다. 명령 줄 인수로 mn을 입력받아 n개의 순열(permutation)을 생성한다. 순열에서 앞의 m개가 무작위 샘플을 나타낸다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.