원숭이가 햄릿을 쓸 수 있을까
원숭이가 타자기를 무작위로 두드리면 언젠가 햄릿이 나온다는 "무한 원숭이 정리"가 있습니다. 하지만 "언젠가"는 얼마나 걸릴까요? 같은 목표를 "순수한 우연"과 "조금씩 나아지는 선택"으로 찾아가는 경주를 보여 드립니다.
모델은 이렇게 움직입니다
- 글자는 알파벳 대문자 26개와 띄어쓰기를 합친 27가지이고, 목표는 햄릿의 대사입니다(
TO BE OR NOT TO BE,METHINKS IT IS LIKE A WEASEL). - 순수한 우연: 한 단계마다 완전히 무작위인 문장 5,000개를 찍어 보고, 목표와 가장 많이 맞은 문장을 기록합니다. 이전 결과는 다음 시도에 아무 영향을 주지 않습니다.
- 누적 선택: 무작위 문장 하나에서 시작해, 한 세대마다 복사본을 만들고 글자마다 일정 확률로 바꿉니다. 목표와 가장 많이 맞는 문장(부모 포함)이 다음 세대의 부모가 됩니다. 맞은 글자가 다음 세대로 이어지는 것이 차이입니다.
- 두 방식 모두 "목표와 맞은 글자 수"로만 평가합니다. 색칠된 글자 칸이 목표와 맞은 곳이에요.
직접 돌려보기
① 두 방식의 경주
위쪽은 순수한 우연(빨강), 아래쪽은 누적 선택(초록)입니다. 색칠된 칸이 목표와 맞은 글자예요. 회색 줄은 우연이 방금 찍은 무작위 글자이고, 아래쪽의 옅은 줄들은 누적 선택에서 맞은 글자 수가 늘어날 때마다의 부모 문장입니다. 맞은 글자가 다음 세대로 이어지며 위에서 아래로 쌓여 가는 것을 보세요.
② 시도 횟수와 맞은 글자 수
가로는 시도 횟수(로그 눈금), 세로는 맞은 글자 수입니다. 선택은 몇천 번 만에 끝나는데 우연은 100만 번을 찍어도 한참 모자랍니다.
③ 문장이 길어지면
가로는 문장 길이, 세로는 성공에 필요한 시도 횟수(로그 눈금)입니다. 붉은 선은 우연의 기댓값(27L), 파란 점은 선택을 6번씩 돌린 결과예요.
④ 돌연변이율을 바꾸면
가로는 글자가 바뀔 확률(돌연변이율), 세로는 완성에 걸린 세대 수입니다. 점은 6번의 실행이에요.
이 결과가 말하는 것, 말하지 않는 것
말하는 것:
- 글자를 한 번에 다 맞혀야 하면 문장이 길수록 사실상 불가능하지만, 맞은 글자를 남겨 쌓으면 길어져도 금방이에요. 18글자는 평균 46세대, 28글자는 평균 77세대였어요.
- 한 번에 맞히려면 글자가 하나 늘 때마다 시도가 27배씩 불어나요. 18글자는 초당 10억 번 시도해도 약 18억 년이지만, 쌓는 쪽은 맞은 글자를 다음으로 넘겨요.
- 다만 문장이 1~2글자로 아주 짧으면 쌓는 쪽이 오히려 우연보다 느렸어요. 작은 개선을 쌓는 힘은 목표가 멀수록 크게 나타나요.
- 그렇다면 쌓기가 빨라지려면? 바꾸는 확률은 너무 낮아도 높아도 느렸고(0.5% 211세대, 5% 44세대, 20% 116세대), 한 번에 만드는 후보가 많을수록 빨랐어요(10개 475세대, 200개 27세대).
상세 설명
말하는 것: 목표를 한 번에 맞히려는 우연은 문장이 길어질수록 기대 시도 횟수가 27배씩 불어나서 사실상 불가능해지지만, 맞은 글자를 이어 가는 누적 선택은 몇천 번 만에 같은 문장에 도달합니다. 같은 우연이라도 "한 번에 다 맞히기"와 "조금씩 쌓기"는 전혀 다른 일이에요.
말하지 않는 것:
- 미리 정한 목표 문장이 있어서 실제 진화의 모델이 아니에요. 도킨스 자신도 이 점을 밝혔고, 원숭이가 실제로 햄릿을 쓰는 이야기도 아니에요.
- 이 모델이 직접 보여 준 건 '한 번에 맞히기'와 '쌓기'의 속도 차이예요. 실제 진화에서 무엇이 걸러지는지는 실제 생물 자료로 따로 확인해야 해요.
상세 설명
말하지 않는 것: 실제 생물의 진화가 이 프로그램처럼 일어난다는 뜻이 아닙니다. 이 모델에는 미리 정해진 목표 문장이 있지만 진화에는 정해진 목표가 없고, 도킨스 자신도 이 점을 밝혔습니다. 이 실험은 "한 번에 맞히는 우연"과 "단계마다 걸러 내는 선택"의 힘의 차이만 보여줍니다. 원숭이가 실제로 햄릿을 쓰는지에 대한 이야기도 아닙니다.
이론적 근거와 구현 메모
- 모델의 뿌리: 타자기를 치는 원숭이 비유는 Émile Borel (1913)까지 거슬러 올라간다고 흔히 인용됩니다. 한편 Richard Dawkins (1986)는 『The Blind Watchmaker』에서 "위즐 프로그램"으로, 우연은 아득히 오래 걸리지만 작은 개선을 쌓아 가는 누적 선택은 훨씬 빠르다는 점을 보였습니다.
- 핵심 가정과 수식: 글자 27가지에서 무작위로 L글자를 치면 한 번에 정확히 맞힐 확률은
27-L이라 기대 시도 횟수는 대략27L입니다. 누적 선택은 복사본 여러 개를 만들고 글자마다 일정 확률로 바꾼 뒤 가장 많이 맞은 복사본만 남깁니다. 복사본 수와 돌연변이율이 슬라이더이고, 글자 수가 늘어도 필요한 시도는 27의 거듭제곱이 아니라 훨씬 완만하게 늘어납니다. - 이 프로젝트의 단순화: Dawkins 본인이 밝혔듯 위즐 프로그램은 미리 정한 목표가 있어서 실제 진화(목표가 없음)의 모형이 아니고 누적 선택이 위력적이라는 점만 보여 주는 비유입니다. 책의 프로그램과 세부 설정이 다르며, 복사본 100개, 돌연변이 5%, 대문자와 띄어쓰기만 쓴 것, 초당 10억 번 시도는 이 프로젝트가 정한 값입니다.
- 이론값과 시뮬레이션: 우연의 기대 횟수는 닫힌 식이라 계산이 맞습니다. 18글자 2718 ≈ 5.8×1025번은 초당 10억 번이면 약 18억 년(우주 나이 138억 년의 0.13배), 28글자 2728 ≈ 1.2×1040번은 약 3.8×1023년이고 validate 출력과 같습니다. 누적 선택은 닫힌 해가 없어 시뮬레이션만으로 확인했고, 기본 설정에서 18글자는 평균 46세대, 28글자는 평균 77세대(20회)였고, 선택 쪽 시도 횟수는 3글자 약 1,000번에서 18글자 약 5,000번으로만 늘었습니다.
- 더 읽을거리: Dawkins (1986), 『The Blind Watchmaker』, Longman(3장). 무한 원숭이 정리는 확률론 교재의 Borel–Cantelli 보조정리 부분에서 다룹니다.
- 이 프로젝트가 직접 짠 구현이며 책의 프로그램을 그대로 옮긴 것은 아닙니다.
- 목표 문장은 햄릿의 대사입니다: "To be, or not to be"(3막 1장)와 "Methinks it is like a weasel"(3막 2장). 글자는 알파벳 대문자 26개와 띄어쓰기이고 쉼표 같은 부호는 뺐습니다.
- 기본 설정(복사본 100개, 돌연변이율 5%)으로 20번 돌리면
TO BE OR NOT TO BE는 평균 46세대(최소 26, 최대 89),METHINKS IT IS LIKE A WEASEL은 평균 77세대(최소 43, 최대 116)가 걸렸습니다. 우연은 100만 번을 찍어도 각각 7/18, 9/28 정도만 맞았습니다. - 우연으로 L글자를 한 번에 맞힐 기대 시도 횟수는 27L입니다. "초당 10억 번 시도"는 이 프로젝트의 가정이고, 우주 나이는 약 138억 년으로 계산했습니다. 18글자는 약 18억 년(우주 나이의 0.13배), 28글자는 약 3.8×1023년입니다.
- 문장이 아주 짧을 때(1~2글자)는 이 설정의 누적 선택이 오히려 우연보다 느립니다. 글자마다 5%만 바뀌기 때문에 복사본 100개로도 변화가 드물기 때문입니다. 검증은
node tools/validate-monkey.js로 할 수 있습니다.