더북(TheBook)

프로그램 1.6.2 랜덤 서퍼 시뮬레이션 (randomsurfer.py)

import random
import sys
import stdarray
import stdio
 
moves = int(sys.argv[1])
 
n = stdio.readInt()
stdio.readInt()      # 이 값은 앞의 n과 동일하므로 굳이 사용할 필요 없다.
p = stdarray.create2D(n, n, 0.0)
for i in range(n):
    for j in range(n):
        p[i][j] = stdio.readFloat()
 
hits = stdarray.create1D(n, 0)
page = 0      # 페이지 0에서 시작한다.
 
for i in range(moves):
    r = random.random()      # p[page] 행에 따라 무작위 페이지를 계산한다.
    total = 0.0              #
    for j in range(0, n):    #
        total += p[page][j]  #
        if r < total:        #
            page = j         #
            break            #
    hits[page] += 1
for v in hits:
    stdio.writef('%8.5f', 1.0 * v / moves)
stdio.writeln()
moves
n
page
p[i][j]
 
hits[i]
이동 횟수
페이지 수
현재 페이지
랜덤 서퍼가 페이지 i에서 
페이지 j로 이동할 확률
랜덤 서퍼가 페이지 i에 
도달한 횟수

이 프로그램은 변환 행렬을 이용해 랜덤 서퍼의 행위를 시뮬레이션한다. 총 이동 횟수를 명령 줄 인수로 받고, 변환 행렬을 읽고, 변환 행렬에 따라 총 이동 횟수만큼 이동한 후, 각 페이지를 방문한 상대적인 빈도를 출력한다. 이 계산의 핵심은 무작위로 다음 페이지로 이동하는 방법이다.

% python3 transition.py < tiny.txt | python3 randomsurfer.py 100
0.24000 0.23000 0.16000 0.25000 0.12000
% python3 transition.py < tiny.txt | python3 randomsurfer.py 10000
0.27280 0.26530 0.14820 0.24830 0.06540
% python3 transition.py < tiny.txt | python3 randomsurfer.py 1000000
0.27324 0.26568 0.14581 0.24737 0.06790
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.