변수 total
은 p[page]
행에 정의된 구간들의 종점을 추적하며, for
루프는 해당 구간에 난수 r
이 들어가는지 알아낸다. 예를 들어 이 예제에서 랜덤 서퍼가 페이지 4에 있다고 하자. 각 변환 확률이 0.47
, 0.02
, 0.47
, 0.02
, 0.02
이므로, total
은 0.0
, 0.47
, 0.49
, 0.96
, 0.98
, 1.0
의 값을 차례대로 취한다. total
값은 확률에 의해 다섯 개의 구간 (0, 0.47), (0.47, 0.49), (0.49, 0.96), (0.96, 0.98), (0.98, 1)을 정의하며, 각기 해당 페이지로 이동할 가능성을 나타낸다. 이제 random.random()
이 0.71
을 반환한다고 가정하자. j
를 0
에서 시작해, 1
을 거치고, 2
에서 멈춘다(그림 1.6.4). 0.71이 (0.49, 0.96) 범위에 있으므로 랜덤 서퍼를 3번째 페이지(즉, 페이지 2)로 보낸다. 그러고 나서 페이지 2에서 이 과정을 다시 반복한다. n
이 큰 경우에는 이진 검색(binary search)을 이용해 계산 속도를 대폭 향상시킬 수 있다([연습문제 4.2.35] 참조). 일반적으로 이런 상황에서는 검색 속도를 향상시킬 방법에 관심을 갖게 된다. 잠시 후에 살펴보겠지만, 무작위로 이동할 페이지가 아주 많기 때문이다.

▲ 그림 1.6.4 이산 분포로부터 무작위 정수 생성하기