المسارات
/
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() لتحويل العدد النسبي. ومن الطبيعي تمامًا أن تستخدم الأعداد النسبية للحفاظ على الدقة خلال عملية حسابية طويلة، ثم تحوّل الناتج إلى عدد الفاصلة العائمة في النهاية.

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 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.