এটিই আমি আমার লর্ডস অফ কনকোস্ট ইমিটেটর অ্যাপলেটটিতে কোনও যুদ্ধের বিজয়ী নির্ধারণ করতে ব্যবহার করেছি। আপনার পরিস্থিতির মতো এই গেমটিতে কেবল একটি আক্রমণ মূল্য এবং প্রতিরক্ষা মান রয়েছে। আক্রমণকারীর যে সম্ভাবনা বেশি জেতা তার আক্রমণকারের যত বেশি পয়েন্ট থাকে এবং ডিফেন্সের যত কম পয়েন্ট থাকে, আক্রমণের 50% সম্ভাবনার সাফল্যের সমান মূল্যবোধ সহ।
অ্যালগরিদম
একটি এলোমেলো মুদ্রা ফ্লিপ করুন।
1A। শিরোনাম: প্রতিরক্ষা একটি পয়েন্ট হারায়।
1B। লেজ: মাথা একটি পয়েন্ট হারায়।
প্রতিরক্ষা এবং আক্রমণকারী উভয়ের যদি এখনও পয়েন্ট থাকে তবে 1 ধাপে ফিরে যান।
যে 0 পয়েন্টের নীচে থাকে সে যুদ্ধটি হেরে যায়।
3a। আক্রমণকারী 0-এ নেমে এসেছে: আক্রমণ ব্যর্থ হয়।
3b। 0 এ প্রতিরক্ষা নিচে: আক্রমণ সফল হয়।
আমি এটি জাভাতে লিখেছি, তবে এটি অন্যান্য ভাষায় সহজে অনুবাদযোগ্য হওয়া উচিত।
Random rnd = new Random();
while (att > 0 && def > 0)
{
if (rnd.nextDouble() < 0.5)
def--;
else
att--;
}
boolean attackSucceeds = att > 0;
একটি উদাহরণ
উদাহরণস্বরূপ, আসুন যে সম্ভাবনা 50% কিনা তা নিশ্চিত করার জন্য এটি = 2 এবং ডিফ = 2 বলুন।
যুদ্ধের সিদ্ধান্ত নেওয়া হবে সর্বাধিক n = att + def - 1
মুদ্রা উল্টানো, বা এই উদাহরণে 3 (এটি মূলত এখানে 3 এর মধ্যে সেরা)। এখানে আছে 2 হয় এন সম্ভাব্য সমাহার মুদ্রা ফ্লিপ। এখানে, "ডাব্লু" অর্থ আক্রমণকারী মুদ্রা ফ্লিপ জিতেছে এবং "এল" এর অর্থ আক্রমণকারী মুদ্রার ফ্লিপটি হারিয়েছে।
L,L,L - Attacker loses
L,L,W - Attacker loses
L,W,L - Attacker loses
L,W,W - Attacker wins
W,L,L - Attacker loses
W,L,W - Attacker wins
W,W,L - Attacker wins
W,W,W - Attacker wins
আক্রমণকারী 4/8 বা 50% মামলায় জয়ী হয়।
ম্যাথ
এই সাধারণ অ্যালগরিদম থেকে উদ্ভূত গাণিতিক সম্ভাবনাগুলি নিজেই অ্যালগরিদমের চেয়ে জটিল।
সংশ্লেষের সংখ্যাটি যেখানে সঠিকভাবে x এলএস সংমিশ্রণ কার্য দ্বারা দেওয়া হয়:
C(n, x) = n! / (x! * (n - x)!)
আক্রমণকারী জয়লাভ করে যখন সেখানে 0
এবং att - 1
এলএস এর মধ্যে থাকে । বিজয়ী সংমিশ্রণের সংখ্যাটি একটি সংখ্যামূলক দ্বিপদী বিতরণ 0
মাধ্যমে সংমিশ্রণের যোগফলের সমান att - 1
:
(att - 1)
w = Σ C(n, x)
x = 0
আক্রমণকারী সম্ভাবনা বিজয়ী W 2 দ্বারা বিভক্ত এন , একটি ক্রমবর্ধমান বাইনমিয়াল সম্ভাব্যতা:
p = w / 2^n
স্বেচ্ছাসেবী att
এবং def
মানগুলির জন্য এই সম্ভাবনাটি গণনা করার জন্য এখানে জাভা কোডটি রয়েছে :
/**
* Returns the probability of the attacker winning.
* @param att The attacker's points.
* @param def The defense's points.
* @return The probability of the attacker winning, between 0.0 and 1.0.
*/
public static double probWin(int att, int def)
{
long w = 0;
int n = att + def - 1;
if (n < 0)
return Double.NaN;
for (int i = 0; i < att; i++)
w += combination(n, i);
return (double) w / (1 << n);
}
/**
* Computes C(n, k) = n! / (k! * (n - k)!)
* @param n The number of possibilities.
* @param k The number of choices.
* @return The combination.
*/
public static long combination(int n, int k)
{
long c = 1;
for (long i = n; i > n - k; i--)
c *= i;
for (long i = 2; i <= k; i++)
c /= i;
return c;
}
পরীক্ষার কোড:
public static void main(String[] args)
{
for (int n = 0; n < 10; n++)
for (int k = 0; k <= n; k++)
System.out.println("C(" + n + ", " + k + ") = " + combination(n, k));
for (int att = 0; att < 5; att++)
for (int def = 0; def < 10; def++)
System.out.println("att: " + att + ", def: " + def + "; prob: " + probWin(att, def));
}
আউটপুট:
att: 0, def: 0; prob: NaN
att: 0, def: 1; prob: 0.0
att: 0, def: 2; prob: 0.0
att: 0, def: 3; prob: 0.0
att: 0, def: 4; prob: 0.0
att: 1, def: 0; prob: 1.0
att: 1, def: 1; prob: 0.5
att: 1, def: 2; prob: 0.25
att: 1, def: 3; prob: 0.125
att: 1, def: 4; prob: 0.0625
att: 1, def: 5; prob: 0.03125
att: 2, def: 0; prob: 1.0
att: 2, def: 1; prob: 0.75
att: 2, def: 2; prob: 0.5
att: 2, def: 3; prob: 0.3125
att: 2, def: 4; prob: 0.1875
att: 2, def: 5; prob: 0.109375
att: 2, def: 6; prob: 0.0625
att: 3, def: 0; prob: 1.0
att: 3, def: 1; prob: 0.875
att: 3, def: 2; prob: 0.6875
att: 3, def: 3; prob: 0.5
att: 3, def: 4; prob: 0.34375
att: 3, def: 5; prob: 0.2265625
att: 3, def: 6; prob: 0.14453125
att: 3, def: 7; prob: 0.08984375
att: 4, def: 0; prob: 1.0
att: 4, def: 1; prob: 0.9375
att: 4, def: 2; prob: 0.8125
att: 4, def: 3; prob: 0.65625
att: 4, def: 4; prob: 0.5
att: 4, def: 5; prob: 0.36328125
att: 4, def: 6; prob: 0.25390625
att: 4, def: 7; prob: 0.171875
att: 4, def: 8; prob: 0.11328125
পর্যবেক্ষণ
0.0
আক্রমণকারীটির 0
পয়েন্ট থাকলে সম্ভাবনাগুলি হ'ল , 1.0
আক্রমণকারীটির পয়েন্ট থাকলেও ডিফেন্সের 0
পয়েন্ট 0.5
থাকে, পয়েন্ট সমান 0.5
হলে আক্রমণকারীর ডিফেন্সের চেয়ে কম পয়েন্ট 0.5
থাকে এবং আক্রমণকারীর ডিফেন্সের চেয়ে বেশি পয়েন্ট থাকলে তার চেয়ে বেশি হয় ।
টেকিং att = 50
এবং def = 80
আমি স্যুইচ করা প্রয়োজন BigDecimal
এড়ানোর ওভারফ্লো থেকে গুলি, কিন্তু আমি 0,0040 সম্পর্কে একটি সম্ভাব্যতা পেতে।
মান এবং মানগুলির att
গড় হিসাবে মান পরিবর্তন করে আপনি সম্ভাব্যতা 0.5 এর কাছাকাছি করতে পারেন । Att = 50, Def = 80 হয়ে যায় (65, 80), যা 0.1056 এর সম্ভাব্যতা দেয়।att
def