놀라운 생일

놀라운 생일

보통

소개

대학을 막 졸업하고, 친구와 가족과 함께 축하하려고 큰 파티를 열었어요. 70명이 넘는 사람이 모였는데, 그중에는 조금 별난 Ted 삼촌도 있었어요.

늘 하던 엉뚱한 장난 중 하나로, 삼촌은 이 방에 생일이 같은 사람이 적어도 두 명은 있다며 £100 내기를 걸어요. 말도 안 되는 소리예요. 가능한 생일이 손님 수보다 훨씬 많으니까요. 그래서 자신 있게 내기를 받아들여요.

놀랍게도, 고작 손님 32명의 생일을 확인했는데 벌써 생일이 같은 두 사람을 찾았어요. 지는 걸 인정하고 Ted 삼촌에게 £100를 건네주지만, 뭔가 이상해요.

다음 날, 궁금증을 이기지 못했어요. 인터넷에서 잠깐 검색해 보니 생일 역설이 나오는데, 사람이 고작 23명만 있어도 생일이 겹칠 확률이 50%를 넘는다고 해요.

아. 그래서 Ted 삼촌이 그렇게 자신만만했던 거군요.

이번에는 상황을 뒤집어 볼 작정으로 다른 역설도 찾아보기 시작해요. 다음번에는 여러분이 내기를 거는 쪽이 될 테니까요.

Note

생일 역설은 진위 역설이에요. 틀린 것처럼 느껴지지만, 사실은 맞는 이야기예요.

지침

이 과제는 생일 역설의 확률을 추정하는 것이에요.

이를 위해 다음을 해야 해요:

  • 무작위 생년월일을 만들어요.
  • 무작위로 만든 생년월일 모음 안에 같은 생일을 가진 것이 적어도 두 개 있는지 확인해요.
  • 그룹 크기별로, 그룹 안에서 적어도 두 사람이 같은 생일을 가질 확률을 추정해요.
Note

생년월일은 태어난 날짜 전체(연, 월, 일)를 가리키고, 생일은 매년 반복되는 월과 일만을 가리켜요. 월과 일이 같은 두 생년월일은 같은 생일에 해당해요.

Caution

생일 역설은 다음을 가정해요:

  • 가능한 생일이 365개예요 (윤년은 없어요).
  • 각 생일이 나올 가능성이 모두 같아요 (균등 분포).

구현은 이 가정을 따라야 해요.

x86-64 어셈블리 관련 참고 사항

random_birthdates() 함수는 다음 속성을 만족하는 날짜를 생성해야 해요:

  1. 연도는 유효해야 해요. 유효한 연도 y는 윤년이 아니면서 1600 <= y < 2129를 만족해요.
  2. 연도는 유효한 값 전체 범위에 걸쳐 균등하게 분포해요.
  3. 생일은 1년 365일 전체에 걸쳐 균등하게 분포해서, 모든 날짜의 확률이 같아요. 즉, 달마다 확률이 같지는 않아요. 31일까지 있는 달은 30일까지 있는 달보다 확률이 높고, 둘 다 2월보다 확률이 높아요.

연도와 생일 분포는 모두 p < 0.0001 수준의 카이제곱 검정으로 확인해요.

즉, 지침대로 날짜를 생성한다면, 검정을 통과하지 못하는 값 분포가 나올 확률은 0.01% 미만이에요.

GitHub에서 편집 링크가 새 창이나 탭에서 열려요
x86-64 Assembly Exercism

놀라운 생일 문제를 시작해 볼 준비가 됐나요?

Exercism에 가입하고 x86-64 Assembly 트랙을 개념 22개연습 문제 130개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.