더북(TheBook)

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

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

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