এই সমস্যাতে, আমাদের চারটি মান p, q, r, s দেওয়া আছে। আমাদের কাজ হলো লক্ষ্য ভেদের সম্ভাবনা দেওয়া থাকলে খেলোয়াড়ের জয় করার সম্ভাবনা বের করা।
এখানে দুজন খেলোয়াড় একটি আর্চারি (archery) খেলা খেলছে। প্রথম খেলোয়াড়ের লক্ষ্য ভেদের সম্ভাবনা p/q। দ্বিতীয় খেলোয়াড়ের লক্ষ্য ভেদের সম্ভাবনা r/s। আমাদের প্রথম খেলোয়াড়ের খেলা জেতার সম্ভাবনা বের করতে হবে।
উদাহরণ দিয়ে সমস্যা বোঝা যাক,
ইনপুট
p = 3, q = 5, r = 2, s = 5
আউটপুট
0.789
সমাধানের পদ্ধতি
*এই পদ্ধতিতে সম্ভাবনা (probability) সম্পর্কে জ্ঞান দরকার।*
যেহেতু খেলোয়াড়রা লক্ষ্য ভেদের জন্য অনন্তবার চেষ্টা করতে পারে, উভয় খেলোয়াড় অনন্তবার লক্ষ্য ভেদ করতে পারে। এটি জয় করার পরিস্থিতি ক্যালকুলেশনকে চেষ্টার সংখ্যা থেকে স্বতন্ত্র করে দেয়।
তাহলে,
প্রথম খেলোয়াড়ের লক্ষ্য ভেদের সম্ভাবনা P1 = p/q, তাহলে মিস করার সম্ভাবনা 1 - p/q।
দ্বিতীয় খেলোয়াড়ের লক্ষ্য ভেদের সম্ভাবনা P2 = r/s, তাহলে মিস করার সম্ভাবনা 1 - r/s।
অনন্ত চেষ্টার জন্য প্রথম খেলোয়াড়ের জয় করার সম্ভাবনা:
win(P1) + (lost(P1)*lost(P2)*win(P1)) + (lost(P1)*lost(P2)*lost(P1)*lost(P2)*win(P1)) + ...
যেটি ফর্মুলেট করা যায়:
P1 + ((1 - P1)*(1 - P2)*(P1)) + ((1 - P1)*(1 - P2)*(1 - P1)*(1 - P2)*(P1)) ...
এটি একটি অনন্ত GP যেখানে:
A = P1 R = [(1 - P1)*(1 - P2)]
যোগফল হবে:
S = A / (1 - R), কারণ R < 1।
$$S=\frac{\frac{p}{q}}{1-(1-\frac{p}{q})*(1-\frac{r}{s})}$$
সমাধান কোড:
উদাহরণ
#include <iostream>
using namespace std;
double calcWinningPropP1(double p, double q, double r, double s){
return (p / q) / (1 - ( (1 - (p/q)) * (1 - (r/s)) ) );
}
int main() {
double p = 3, q = 5, r = 2, s = 5;
cout<<"The probability of player 1 winning is "<<calcWinningPropP1(p, q, r, s);
return 0;
}
আউটপুট
The probability of player 1 winning is 0.789474