مسیرها
/
Julia
Julia
/
تمرین‌ها
/
احتمال‌های مشکل‌ساز
احتمال‌های مشکل‌ساز

احتمال‌های مشکل‌ساز

تمرین یادگیری

مقدمه

Rational numbers کسرهایی هستند که صورت آن‌ها یک عدد صحیح و مخرجشان یک عدد صحیح است.

برای مثال، می‌توانیم 2//3 را به‌صورت یک کسر دقیق ذخیره کنیم، به‌جای مقدار تقریبی Float64 که 0.6666... است.

مزیت این کار آن است که (جز در حالت حاد سرریز عدد صحیح) یک عدد گویا دقیق باقی می‌ماند و از خطاهای گردکردنی که در اعداد ممیز شناور اغلب گریزناپذیرند جلوگیری می‌کند.

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

ساخت اعداد گویا

ساختن آن‌ها به همین سادگی است که // را بین دو عدد صحیح قرار دهید.

julia> 3//4
3//4

julia> a = 3; b = 4;

julia> a//b
3//4

عامل‌های مشترک به‌طور خودکار حذف می‌شوند و کسر به «ساده‌ترین شکل» خود تبدیل می‌شود: کوچک‌ترین اعداد صحیحی که کسر را به‌درستی نمایش می‌دهند و مخرجی نامنفی دارند.

julia> 5//15
1//3

julia> 5//-15
-1//3

محاسبات با اعداد گویا

arithmetic operators معمول، یعنی + - * / ^ %، با اعداد گویا کار می‌کنند، تقریباً همان‌طور که با دیگر انواع عددی کار می‌کنند.

اعداد صحیح و دیگر Rationalها را می‌توان در عبارت گنجاند و نتیجه یک Rational به دست می‌آید. گنجاندن یک float در عبارت، خروجی float می‌دهد و در پی آن (احتمالاً) دقت از دست می‌رود.

اگر float می‌خواهید، کافی است از تابع float() برای تبدیل یک عدد گویا استفاده کنید. کاملاً معمول است که از اعداد گویا برای حفظ دقت در یک محاسبه‌ی طولانی استفاده کنید و در پایان، نتیجه را به float تبدیل کنید.

julia> 3//4 + 1//3  # addition
13//12

julia> 3//4 * 1//3  # multiplication
1//4

julia> 3//4 / 1//3  # division
9//4

julia> 3//4 ^ 2  # exponentiation
3//16

julia> 3//4 + 5  # rational and int => rational
23//4

julia> 3//4 + 5.3  # rational and float => float
6.05

julia> float(3//4)  # casting
0.75

عملیات دیگر

در Julia، اعداد گویا فقط عدد هستند. کامپایلر معمولاً در صورت نیاز نوع‌ها را تبدیل می‌کند.

با این حال، حواستان باشد که مقایسه‌ها برای کسرهایی کار می‌کنند که نمایش اعشاری متناهی دارند:

julia> 3//4 == 0.75
true

julia> 3//4 < 0.74
false

اما در غیر این صورت، برای مقایسه‌ها باید یک Rational را به Float تبدیل کرد:

julia> 1//3 == 1/3
false

julia> float(1//3) == 1/3
true

توابع ریاضی اعداد گویا را به‌عنوان ورودی می‌پذیرند، اما ممکن است نتیجه‌ای ممیز شناور بدهند:

julia> sqrt(9//16)
0.75

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

یک سازمان پژوهشی متوجه شده است که برخی از پژوهشگران تازه‌کارش در تحلیل‌های خود از روش‌های چندان بهینه‌ای استفاده می‌کنند. یکی از این روش‌ها، تبدیل بی‌درنگ احتمال‌های گسسته به اعداد اعشاری (یعنی اعداد حقیقی) پیش از انجام محاسبات بیشتر است.

پژوهشگران ارشد ترجیح می‌دهند در محاسبات از اعداد گویا استفاده کنند، چون ممکن است دقت بالاتری به دست دهد، و می‌خواهند بدانند آیا روش‌های ضعیف پژوهشگران تازه‌کار روی نتایج مطالعات تأثیر گذاشته است یا نه.

دو نوع مطالعه انجام شده بود:

  • آزمون‌های زیادی اجرا شد و هر کدام یک احتمال گسسته برای موفقیت برگرداند. سپس میانگین این احتمال‌ها محاسبه شد.
  • رویدادهای مستقل زیادی آزموده شد و احتمال کل وقوع همه‌ی رویدادها با ضرب کردن آن‌ها در هم محاسبه شد.

پژوهشگران ارشد از شما می‌خواهند توابعی بنویسید که به آن‌ها کمک کند تعیین کنند آیا در تحلیل‌هایی که با اعداد اعشاری انجام شده خطای گرد کردن وجود دارد یا نه، و اگر چنین خطاهایی هست، یک عدد گویای دقیق برای نتیجه در اختیارشان بگذارید.

1. نسبت موفقیت‌ها به آزمون‌ها را بدهید

تابع rationalize(successes, trials) دو آرایه‌ی successes و trials را می‌گیرد. برای اندیس i، مقدار successes[i] به تعداد موفقیت‌هایی اشاره دارد که در trials[i] آزمون رخ داده است. این تابع آرایه‌ای از اعداد گویا برمی‌گرداند که نسبت موفقیت‌ها به تعداد آزمون‌ها را نشان می‌دهد، با همان ترتیبی که در آرایه‌های ورودی آمده است.

julia> rationalize([1, 2, 3], [4, 5, 6])
3-element Vector{Rational{Int64}}:
 1//4
 2//5
 1//2

2. احتمال‌های حقیقی متناظر با موفقیت‌ها و آزمون‌ها را پیدا کنید

به همین ترتیب، تابع probabilities(successes, trials) دو آرایه‌ی successes و trials را می‌گیرد. این تابع آرایه‌ای از اعداد اعشاری برمی‌گرداند که نسبت موفقیت‌ها به تعداد آزمون‌ها را نشان می‌دهد، با همان ترتیبی که در آرایه‌های ورودی آمده است.

julia> probabilities([1, 2, 3], [4, 5, 6])
3-element Vector{Float64}:
 0.25
 0.4
 0.5

3. میانگین احتمال‌ها را بررسی کنید

تابع checkmean(successes, trials) دو آرایه‌ی successes و trials را می‌گیرد. این تابع میانگین احتمال‌های حقیقی را با میانگین احتمال‌های گویا مقایسه می‌کند.

  • اگر این دو احتمال برابر باشند، checkmean مقدار true را برمی‌گرداند.
  • اگر این دو احتمال متفاوت باشند، checkmean احتمال گویا را برمی‌گرداند.
julia> successes, trials = [9, 4, 7, 8, 6], [22, 22, 11, 17, 12];
julia> checkmean(successes, trials)
true

julia> successes, trials = [6, 5, 9, 8, 9], [21, 19, 13, 25, 22];
julia> checkmean(successes, trials)
1873629//4754750

4. احتمال مستقل را بررسی کنید

تابع checkprob(successes, trials) دو آرایه‌ی successes و trials را می‌گیرد. این تابع احتمال کل حاصل از احتمال‌های اعشاری را با احتمال کل حاصل از احتمال‌های گویا مقایسه می‌کند.

  • اگر این دو احتمال برابر باشند، checkprob مقدار true را برمی‌گرداند.
  • اگر این دو احتمال متفاوت باشند، checkprob احتمال گویا را برمی‌گرداند.
julia> successes, trials = [2, 9, 4, 4, 5], [15, 11, 17, 19, 15];
julia> checkprob(successes, trials)
true

julia> successes, trials = [9, 8, 5, 4, 3], [22, 14, 19, 25, 18];
julia> checkprob(sucesses, trials)
12//7315
ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
Julia Exercism

آماده‌اید احتمال‌های مشکل‌ساز را شروع کنید؟

در Exercism ثبت‌نام کنید تا Julia را همراه با 35 مفهوم128 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.