더북(TheBook)

gambler.py에서는 시뮬레이션 결과를 고전적인 확률 이론으로 검증해보면 돈을 딸 확률은 목표액에 대한 판돈 비율이며, 예상 베팅 수는 초기 판돈과 벌고자 하는 돈(목표액과 초기 판돈의 차액)의 곱에 비례한다. 예를 들어 도박장에 가서 $500를 $2,500로 만들고자 하는 경우, 성공률은 나쁘지 않지만(20%), $1 베팅을 백만 번 해야 한다. $1를 $1,000으로 만들고자 하는 경우, 성공률은 0.1%이며(대부분의 경우 파산한다) 돈을 따려면 (평균적으로) 999번 베팅해야 한다.

시뮬레이션과 분석은 나란히 서로를 검증한다. 실제로 시뮬레이션 값은 분석하기 너무 어려워서 대답하기 어려운 문제에 대한 답을 제시한다. 예를 들어 백만 번이나 베팅할 시간이 없다는 걸 잘 아는 도박꾼은 베팅 수 한도를 사전에 설정하고자 할 것이다. 각각의 경우 도박꾼은 얼마만큼의 돈을 가져갈 수 있다고 예상할 수 있을까? [프로그램 1.3.8]을 수정하면(연습문제 1.3.24) 간단히 답할 수 있지만, 수학적으로 분석해 답을 구하기는 쉽지 않다.

소인수 분해 소수(prime number)1과 자신 이외의 다른 양수로는 나누어지 않는 1보다 큰 수를 말한다. 정수를 소인수 분해하면 여러 소수의 곱으로 표현된다. 예를 들어 3757208 = 2*2*2*7*13*13*397으로 분해할 수 있다. [프로그램 1.3.9](factors.py)는 주어진 양의 정수를 소인수 분해한다. 우리가 지금까지 보아온 (계산기나 심지어 종이와 연필로 몇 분 만에 풀 수 있는) 문제들과는 반대로, 이렇게 큰 숫자는 컴퓨터 없이는 계산할 수 없다. 287994837222311같은 수의 소인수를 어떻게 찾아낼 수 있을까? 소인수 17은 간단히 찾을 수 있을지 모르지만, 계산기를 사용해도 1739347을 찾아내기까지는 상당한 시간이 걸린다.

factors.py는 짧고 간단하지만 모든 정수에 대해 원하는 결과를 출력할지 확신이 들기까지는 약간의 시간이 필요할 것이다. 늘 해오던 것처럼 바깥쪽 while 루프를 반복할 때마다 변숫값을 추적해보면 코드가 수행하는 부분을 이해하기 쉬울 것이다. n의 초깃값이 3757208인 경우, 내부 while 루프는 factor2일 때 3번, 3, 4, 5, 6일 때는 한 번도 반복되지 않는다. 3, 4, 5, 6469651을 나눌 수 없기 때문이다. 그러고 나서 factor를 계속 하나씩 증가시키면서 나눌 수 있는지 여부를 확인한다.

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