ট্র্যাক
/
Julia
Julia
/
অনুশীলনী
/
সমস্যাপূর্ণ সম্ভাব্যতা
সমস্যাপূর্ণ সম্ভাব্যতা

সমস্যাপূর্ণ সম্ভাব্যতা

লার্নিং অনুশীলনী

ভূমিকা

Rational numbers হলো এমন ভগ্নাংশ, যার লব একটি ইন্টিজার আর হরও একটি ইন্টিজার।

উদাহরণস্বরূপ, আনুমানিক Float64 মান 0.6666...-এর বদলে আমরা 2//3-কে একটি সঠিক ভগ্নাংশ হিসেবে সংরক্ষণ করতে পারি।

এর সুবিধা হলো, (ইন্টিজার ওভারফ্লো-র চরম পরিস্থিতি ছাড়া) একটি র‍্যাশনাল সংখ্যা নির্ভুল থাকে, ফলে ফ্লোটিং-পয়েন্ট সংখ্যায় যে রাউন্ডিং এরর প্রায়শই অনিবার্য হয়ে দাঁড়ায়, তা এড়ানো যায়।

র‍্যাশনাল সংখ্যা একটি বেশ সরল সংখ্যার টাইপ, আর আপনি যেমনটা আশা করবেন ঠিক তেমনভাবেই কাজ করার লক্ষ্য নিয়ে এগুলো তৈরি।

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টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।