यह वही है जो मैंने अपने लॉर्ड्स ऑफ कॉन्क्वेस्ट इमिटेटर एप्लेट में एक लड़ाई के विजेता को निर्धारित करने के लिए उपयोग किया था। इस खेल में, आपकी स्थिति के समान, बस एक हमले का मूल्य और एक रक्षा मूल्य है। हमलावर के जीतने की संभावना अधिक होती है और हमलावर के पास जितने अधिक बिंदु होते हैं, और रक्षा के 50% मौके का मूल्यांकन करने वाले समान मूल्यों के साथ, रक्षा के अधिक अंक होते हैं।
कलन विधि
एक यादृच्छिक सिक्का पलटें।
1 क। प्रमुख: रक्षा एक बिंदु खो देता है।
1b। पूंछ: सिर एक बिंदु खो देता है।
यदि रक्षा और हमलावर दोनों के पास अभी भी अंक हैं, तो चरण 1 पर वापस जाएं।
जो भी 0 अंक से नीचे है वह लड़ाई हार जाता है।
3 ए। 0 से नीचे हमलावर: हमला विफल रहता है।
3 बी। 0 से नीचे रक्षा: हमला सफल होता है।
मैंने इसे जावा में लिखा था, लेकिन इसे आसानी से अन्य भाषाओं में अनुवाद किया जाना चाहिए।
Random rnd = new Random();
while (att > 0 && def > 0)
{
if (rnd.nextDouble() < 0.5)
def--;
else
att--;
}
boolean attackSucceeds = att > 0;
एक उदाहरण
उदाहरण के लिए, मान लें कि att = 2 और def = 2 है, बस यह सुनिश्चित करने के लिए कि संभावना 50% है।
लड़ाई का फैसला अधिकतम n = att + def - 1
सिक्के के उतार-चढ़ाव में किया जाएगा, या इस उदाहरण में 3 (यह अनिवार्य रूप से यहां 3 का सबसे अच्छा है)। सिक्का फ़्लिप के 2 n संभावित संयोजन हैं। यहाँ, "W" का अर्थ है कि हमलावर ने सिक्का फ्लिप जीत लिया, और "L" का अर्थ है हमलावर ने सिक्का फ्लिप खो दिया।
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 xs के संयोजन की संख्या दी गई है:
C(n, x) = n! / (x! * (n - x)!)
जब 0
और att - 1
Ls के बीच हो तो हमलावर जीत जाता है । सफल संयोजनों की संख्या से संयोजनों की राशि के बराबर है 0
के माध्यम से att - 1
, एक संचयी द्विपदी बंटन:
(att - 1)
w = Σ C(n, x)
x = 0
हमलावर की संभावना जीत रहा है डब्ल्यू 2 से विभाजित n , एक संचयी द्विपदी संभावना:
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