مسیرها
/
x86-64 Assembly
x86-64 Assembly
/
تمرین‌ها
/
تولدهای گیج‌کننده
تولدهای گیج‌کننده

تولدهای گیج‌کننده

متوسط

مقدمه

تازه از دانشگاه فارغ‌التحصیل شده‌اید و مهمانی بزرگی به راه انداخته‌اید تا با دوستان و خانواده جشن بگیرید. بیش از ۷۰ نفر آمده‌اند، از جمله عمو Ted که تا حدودی عجیب‌وغریب است.

در یکی از شیطنت‌های همیشگی‌اش، با شما ۱۰۰ پوند شرط می‌بندد که دست‌کم دو نفر در این اتاق تولدشان یکی است. این حرف مسخره به نظر می‌رسد، چون تعداد تولدهای ممکن بسیار بیشتر از تعداد مهمان‌هاست. پس با اطمینان شرط را می‌پذیرید.

در کمال حیرتتان، پس از جمع‌آوری تولد فقط ۳۲ مهمان، همین حالا دو مهمان پیدا کرده‌اید که تولدشان یکی است. شکست را می‌پذیرید و ۱۰۰ پوند را به عمو Ted می‌دهید، اما چیزی درست به نظر نمی‌رسد.

روز بعد، کنجکاوی بر شما غلبه می‌کند. یک جست‌وجوی سریع در وب شما را به «پارادوکس تولد» می‌رساند؛ این پارادوکس نشان می‌دهد که با تنها ۲۳ نفر، احتمال اینکه دو نفر تولد مشترک داشته باشند از ۵۰٪ بیشتر می‌شود.

آهان. پس برای همین بود که عمو Ted این‌قدر مطمئن بود.

مصمم هستید که ورق را برگردانید، پس شروع می‌کنید به جست‌وجو درباره‌ی پارادوکس‌های دیگر؛ دفعه‌ی بعد شما کسی خواهید بود که شرط می‌بندد.

Note

پارادوکس تولد یک «پارادوکس صادق» است: با اینکه نادرست به نظر می‌رسد، در واقع درست است.

دستورالعمل‌ها

وظیفه‌ی شما برآورد احتمال‌های پارادوکس تولد است.

برای این کار باید:

  • تاریخ‌های تولد تصادفی تولید کنید.
  • بررسی کنید که آیا در مجموعه‌ای از تاریخ‌های تولد تصادفی، دست‌کم دو مورد با روز تولد یکسان وجود دارد یا نه.
  • برای اندازه‌های مختلف گروه، احتمال این را برآورد کنید که دست‌کم دو نفر در یک گروه روز تولد یکسان داشته باشند.
Note

«تاریخ تولد» شامل تاریخ کامل تولد است (سال، ماه و روز)، در حالی که «روز تولد» فقط به ماه و روز اشاره دارد که هر سال تکرار می‌شوند. دو تاریخ تولد با ماه و روز یکسان، به یک روز تولد مربوط می‌شوند.

Caution

«پارادوکس تولد» این فرض‌ها را در نظر می‌گیرد:

  • ۳۶۵ روز تولد ممکن وجود دارد (بدون سال‌های کبیسه).
  • هر روز تولد به یک اندازه محتمل است (توزیع یکنواخت).

پیاده‌سازی شما باید این فرض‌ها را رعایت کند.

نکته‌های مخصوص x86-64 Assembly

تابع random_birthdates() باید تاریخ‌هایی با ویژگی‌های زیر تولید کند:

  1. سال باید معتبر باشد. یک سال معتبر مانند y کبیسه نیست و باید 1600 <= y < 2129 باشد.
  2. سال به‌طور یکنواخت در سراسر بازه‌ی مقادیر معتبر توزیع شده است.
  3. روز تولد به‌طور یکنواخت روی همه‌ی ۳۶۵ روز سال توزیع شده است، به‌طوری‌که احتمال هر روز تقویمی یکسان باشد. توجه کنید که این یعنی احتمال ماه‌ها برابر نیست: احتمال یک ماه ۳۱ روزه از یک ماه ۳۰ روزه بیشتر است و هر دوی آن‌ها از فوریه محتمل‌ترند.

توزیع سال و توزیع روز تولد هر دو با یک «آزمون خی‌دو» در سطح p < ۰٫۰۰۰۱ بررسی می‌شوند.

این یعنی اگر تاریخ‌ها طبق دستورالعمل‌ها تولید شوند، احتمال اینکه توزیعی از مقادیر به دست آید که آزمون را رد کند، کمتر از ۰٫۰۱٪ است.


منبع

Erik Schierboomاین لینک در پنجره یا تب جدیدی باز می‌شود.
ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
x86-64 Assembly Exercism

آماده‌اید تولدهای گیج‌کننده را شروع کنید؟

در Exercism ثبت‌نام کنید تا x86-64 Assembly را همراه با 22 مفهوم130 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.