দেওয়া কাজ হল M ফেস বিশিষ্ট একটি ডাইস N বার নিক্ষেপ করার পর সর্বোচ্চ ডটের আশা মান (expected value) ক্যালকুলেট করা।
ডাইসের প্রথম ফেসে ১ ডট, দ্বিতীয় ফেসে ২ ডট, এভাবে M-তম ফেসে M ডট থাকে। প্রতিটি ফেস আসার সম্ভাবনা ১/M।
উদাহরণ দিয়ে বোঝা যাক
ইনপুট - M=2, N=3
আউটপুট - ১.৮৭৫
ব্যাখ্যা - ডাইসের ২ পাশ = {1, 2}
ডাইস ৩ বার নিক্ষেপ করলে স্যাম্পল স্পেস = Mᴺ = ২³ = ৮
{(1, 1, 1), (1, 1, 2), (1, 2, 1), (1, 2, 2)
(2, 1, 1), (2, 1, 2), (2, 2, 1), (2, 2, 2)}
(1,1,1)-এ সর্বোচ্চ = ১
অন্য সব কেসে সর্বোচ্চ = ২
প্রতিটি কেসের সম্ভাবনা = ১/৮ = ০.১২৫
সর্বোচ্চ সংখ্যার আশা মান = (১+২+২+২+২+২+২+২) × ০.১২৫ = ১.৮৭৫
ইনপুট - M=2, N=2
আউটপুট - ১.৭৫
প্রোগ্রামে ব্যবহৃত পদ্ধতি
একটি সংখ্যা সর্বোচ্চ হওয়ার কেসের সংখ্যা এর আগের সংখ্যা দিয়ে বের করা যায় ফর্মুলা: iᴺ - (i-1)ᴺ।
উদাহরণস্বরূপ, M=4, N=2 হলে, সর্বোচ্চ = ৪ হয় এমন কেসের সংখ্যা = ৪² - ৩² = ৭।
ফাইনাল আউটপুট হবে ১ থেকে M পর্যন্ত প্রতিটি উপাদানের জন্য এই ফর্মুলা লাগিয়ে যোগফল -
(i * (iᴺ - (i - 1)ᴺ)) / Mᴺ এবং সেগুলো যোগ করা।
MaxExpect() ফাংশনে max = 0.0 ডাবল ভেরিয়েবল আরম্ভ করুন যোগফল সংরক্ষণের জন্য।
তারপর i=M থেকে i>0 পর্যন্ত লুপ চালান।
লুপের ভেতরে উপরের ফর্মুলা প্রয়োগ করুন এবং ফলাফল max-এ যোগ করুন।
C++ প্রোগ্রাম উদাহরণ
#include <bits/stdc++.h>
using namespace std;
double MaxExpect(double M, double N){
double max = 0.0, i;
for (i = M; i; i--)
/*সর্বোচ্চ সংখ্যা বের করার ফর্মুলা এবং
সর্বোচ্চ সংখ্যাগুলোর যোগফল*/
max += (pow(i / M, N) - pow((i - 1) / M, N)) * i;
return max;
}
int main(){
double M = 2, N = 3;
cout << MaxExpect(M, N);
return 0;
}
আউটপুট
1.875