تازه از دانشگاه فارغالتحصیل شدهاید و مهمانی بزرگی به راه انداختهاید تا با دوستان و خانواده جشن بگیرید. بیش از ۷۰ نفر آمدهاند، از جمله عمو Ted که تا حدودی عجیبوغریب است.
در یکی از شیطنتهای همیشگیاش، با شما ۱۰۰ پوند شرط میبندد که دستکم دو نفر در این اتاق تولدشان یکی است. این حرف مسخره به نظر میرسد، چون تعداد تولدهای ممکن بسیار بیشتر از تعداد مهمانهاست. پس با اطمینان شرط را میپذیرید.
در کمال حیرتتان، پس از جمعآوری تولد فقط ۳۲ مهمان، همین حالا دو مهمان پیدا کردهاید که تولدشان یکی است. شکست را میپذیرید و ۱۰۰ پوند را به عمو Ted میدهید، اما چیزی درست به نظر نمیرسد.
روز بعد، کنجکاوی بر شما غلبه میکند. یک جستوجوی سریع در وب شما را به «پارادوکس تولد» میرساند؛ این پارادوکس نشان میدهد که با تنها ۲۳ نفر، احتمال اینکه دو نفر تولد مشترک داشته باشند از ۵۰٪ بیشتر میشود.
آهان. پس برای همین بود که عمو Ted اینقدر مطمئن بود.
مصمم هستید که ورق را برگردانید، پس شروع میکنید به جستوجو دربارهی پارادوکسهای دیگر؛ دفعهی بعد شما کسی خواهید بود که شرط میبندد.
پارادوکس تولد یک «پارادوکس صادق» است: با اینکه نادرست به نظر میرسد، در واقع درست است.
وظیفهی شما برآورد احتمالهای پارادوکس تولد است.
برای این کار باید:
«تاریخ تولد» شامل تاریخ کامل تولد است (سال، ماه و روز)، در حالی که «روز تولد» فقط به ماه و روز اشاره دارد که هر سال تکرار میشوند. دو تاریخ تولد با ماه و روز یکسان، به یک روز تولد مربوط میشوند.
«پارادوکس تولد» این فرضها را در نظر میگیرد:
پیادهسازی شما باید این فرضها را رعایت کند.
تابع random_birthdates() باید تاریخهایی با ویژگیهای زیر تولید کند:
y کبیسه نیست و باید 1600 <= y < 2129 باشد.توزیع سال و توزیع روز تولد هر دو با یک «آزمون خیدو» در سطح p < ۰٫۰۰۰۱ بررسی میشوند.
این یعنی اگر تاریخها طبق دستورالعملها تولید شوند، احتمال اینکه توزیعی از مقادیر به دست آید که آزمون را رد کند، کمتر از ۰٫۰۱٪ است.
در Exercism ثبتنام کنید تا x86-64 Assembly را همراه با 22 مفهوم130 تمرین و مربیگری انسانی واقعی یاد بگیرید و در آن استاد شوید، همهی اینها رایگان.