더북(TheBook)

프로그램 1.4.1 교환하는 대신 샘플 추출하기 (sample.py)

import random
import sys
import stdarray
import stdio
 
m = int(sys.argv[1])     # m개의 요소를 선택한다.
n = int(sys.argv[2])     # 0, 1, ..., n-1 중에서
 
# 배열 perm을 [0, 1, ..., n-1]으로 초기화한다.
perm = stdarray.create1D(n, 0)
for i in range(n):
    perm[i] = i 
 
# perm[0..m)에 m개의 무작위 샘플을 생성한다.
for i in range(m):
    r = random.randrange(i, n)
 
    # perm[i]와 perm[r]을 교환한다.
    temp    = perm[r]
    perm[r] = perm[i]
    perm[i] = temp
 
# 결과를 출력한다.
for i in range(m):
    stdio.write(str(perm[i]) + ' ')
stdio.writeln()
m
n
perm[]
샘플 크기
범위
0부터 n-1 사이의 조합

이 프로그램은 명령 줄 인수로 mn을 입력받아 0n-1 사이에서 중복되지 않은 숫자 m 개를 무작위로 샘플링해 출력한다. 이 과정은 로또뿐만 아니라 과학 분야에서 다양하게 응용된다. 첫 번째 인수가 두 번째 인수보다 작거나 같으면 0에서 n-1 사이 정수의 무작위 순열이 된다. 첫 번째 인수가 두 번째 인수보다 크면 프로그램 실행 시 ValueError를 출력한다.

% python3 sample.py 6 16
9 5 13 1 11 8
% python3 sample.py 10 1000
656 488 298 534 811 97 813 156 424 109
% python3 sample.py 20 20
6 12 9 8 13 19 0 2 4 5 18 1 14 16 17 3 7 11 10 15
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.