function getTiltedHeight(angle) {
const a = 100;
const A = 90 - angle;
const c = a / Math.sin(Math.PI * A / 180);
const b = Math.sqrt(Math.pow(c, 2) - Math.pow(a, 2));
return `${Math.abs(b)}%`;
}
Claude Code가 일하는 동안 스피너 옆에 단어가 하나씩 뜬다. 목록은 90개쯤 되고 매 초 바뀐다고 하자. 90개를 다 보려면 90초쯤 걸릴까.
아니다. 평균 7분 반이 걸린다. 5배다.
목록을 한 번 섞어서 처음부터 끝까지 도는 게 아니라 매번 90개 중에서 새로 뽑기 때문이다. 그러면 이미 본 단어가 계속 다시 나온다. 섞어 돌았다면 90초에 정확히 끝났을 일이다.
꼬리가 어디서 생기는지가 핵심이다. 89개를 모았을 때, 남은 마지막 하나를 뽑을 확률은 90분의 1이다. 그 한 단어를 만나는 데만 평균 90초 — 섞어서 돌았다면 90개 전부를 봤을 시간이다.1
이게 쿠폰 수집가 문제(coupon collector)다. 전부 모으는 데 걸리는 평균 횟수는
n × (1 + 1/2 + 1/3 + … + 1/n)
n = 90이면 약 457번, 매 초 하나씩이니 7.6분이다.
곁가지 — 커스텀 단어를 덧붙이면 목록이 길어지니 빌트인 단어가 뽑힐 확률은 그만큼 낮아진다. 다양해 보이려고 추가한 게 원래 있던 것들을 밀어낸다.
Footnotes
-
전부 모으는 기대 횟수는
n·H_n(H_n은 조화수). 그리고i번째 새 쿠폰까지의 기대 대기는n/(n-i+1)이므로 마지막 한 장은n/1 = n— 단계 중 가장 오래 걸린다. (Coupon collector’s problem — Wikipedia) ↩