프로그램 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