Lords of Conquest Imitator uygulamamda bir savaşın galibini belirlemek için kullandım. Bu oyunda, durumunuza benzer şekilde, sadece bir saldırı değeri ve bir savunma değeri vardır. Saldırganın kazanma olasılığı, saldırganın puanı ne kadar fazlaysa ve savunmanın puanları da o kadar az olursa, eşit değerler saldırının başarı şansını% 50 olarak değerlendirir.
Algoritma
Rastgele bir bozuk para çevirin.
1 A. Heads: Savunma bir puan kaybeder.
1b. Kuyruklar: kafalar bir puan kaybeder.
Hem savunma hem de saldırganın hala puanları varsa, 1. adıma geri dönün.
Kim 0 puana düşerse savaşı kaybeder.
3 A. Saldırgan 0'a düştü: Saldırı başarısız.
3b. 0'a kadar savunma: Saldırı başarılı.
Java ile yazdım, ancak diğer dillere kolayca çevrilebilir olmalıdır.
Random rnd = new Random();
while (att > 0 && def > 0)
{
if (rnd.nextDouble() < 0.5)
def--;
else
att--;
}
boolean attackSucceeds = att > 0;
Bir örnek
Örneğin, sadece olasılığın% 50 olduğundan emin olmak için att = 2 ve def = 2 olduğunu varsayalım.
Savaş, n = att + def - 1
bu örnekte maksimum jeton dönüşü veya 3 olarak kararlaştırılacaktır (aslında burada 3'ün en iyisi). Madeni para döndürme işlemlerinin 2 n olası kombinasyonu vardır. Burada, "W", saldırganın jetonlu flip kazandığı anlamına gelirken, "L", saldırganın jetonlu çevirmeyi kaybettiği anlamına gelir.
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
Saldırgan 4/8 veya% 50 oranında kazanır.
Matematik
Bu basit algoritmadan kaynaklanan matematiksel olasılıklar, algoritmanın kendisinden daha karmaşıktır.
Tam olarak x L'nin bulunduğu kombinasyon sayısı , kombinasyon işlevi tarafından verilir:
C(n, x) = n! / (x! * (n - x)!)
Saldırgan 0
ile att - 1
Ls arasında kazanır . Kazanan kombinasyonların sayısı, birikimli binom dağılımı 0
ile arasındaki kombinasyonların toplamına eşittir att - 1
:
(att - 1)
w = Σ C(n, x)
x = 0
Saldırgan olasılığıdır kazanan w 2 bölü n , kümülatif binom olasılık:
p = w / 2^n
Java'da rasgele att
ve def
değerler için bu olasılığı hesaplamak için kod :
/**
* 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;
}
Test kodu:
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));
}
Çıktı:
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
Gözlemler
Olasılıklar 0.0
, saldırganın 0
puanları varsa, saldırganın puanları 1.0
varsa, ancak savunmanın 0
puanları 0.5
varsa, puanlar eşitse, 0.5
saldırganın savunmadan daha az puanı 0.5
varsa ve saldırganın savunmadan daha fazla puanı varsa daha fazladır .
Alarak att = 50
ve def = 80
ben geçmek için gerekli BigDecimal
önlemek taşması s ama 0.0040 yaklaşık bir olasılık olsun.
att
Değeri att
ve def
değerlerinin ortalaması olacak şekilde değiştirerek olasılığı 0,5'e yaklaştırabilirsiniz . Att = 50, Def = 80 olur (65, 80), bu da 0.1056 olasılığı verir.