Nakavt olasılıkları


9

Knockout, oyuncuların sırayla ateş ettiği bir basketbol oyunudur. Her biri bu oyunculardan birini "öldürme" olan iki kişilik yarışmalar dizisi olarak oynanır.

Oyuncuların A B C Dve 0.1 0.2 0.3 0.4yarışmadaki diğer oyuncudan bağımsız olarak, atış ve sepet yapma şanslarının sırasıyla olduğunu varsayalım . Çizginin önündeki iki oyuncu Ave B"kavga". Yana Ailk gider, öyle savunucusu yok olma tehlikesiyle karşı karşıya, ve Bbir saldırganın değil, hemen ortadan kaldırılması tehlikesi. Aönce vuruyor. Eğer Abunu yapar, Abaşarıyla savundu ve sıranın arkasına gider. Çizgi olarak değişir B C D A. Eğer Abaşaramazsa, Bvuruyor. Eğer yaparsa B, o zaman Adışarı çıkar ve Bçizginin arkasına gider, böylece çizgi olur C D B. Eğer ikisi deAveya Bbunu yapmazsa, işlem bir sepet Ayapana Aveya tekrarlayana kadar tekrar çekim yaparak tekrar eder B.

Çizginin olarak değiştirildiğini B C D A( Abaşarıyla savunduğunu) varsayalım . Şimdi Bve C"savaş" B, savunucu ve Csaldırgan olarak. Bu işlem yalnızca bir kişi kalana kadar tekrarlanır. O kişi kazanır.

Senin görevin, sepet yapma şansı göz önüne alındığında her bir kişinin kazanma olasılıklarını hesaplamaktır.

Giriş :

Gibi sayıların, bir listesi 0.1 0.2veya 0.5 0.5 0.5 0.5, n inci sayı o şans n inci oyuncu bir sepet yapacaktır. Bu girdiyi, bir işleve parametreler de dahil olmak üzere istediğiniz herhangi bir biçimde alabilirsiniz.

Çıktı :

Sayılar, bir listesi n inci sayı o şans n inci oyuncu oyunu kazanır. Sayılarınız en az iki ondalık basamağa kadar en az% 90 oranında doğru olmalıdır. Bu, simülasyon tabanlı bir yaklaşım kullanabileceğiniz anlamına gelir. Bununla birlikte, kodunuz simülasyon tabanlı değilse ( en az 6 ondalık basamağa doğru bir cevap vermeniz garanti edilir), puanınızdan% 30 oranında uzaklaşın.

Örnekler arasında 0.5 0.5: Oyuncuları arayın Ave B. Izin vermek pA olasılığı olasılığı olsun . ABir sahiptir 2/3başarıyla savunan şansını (bir var çünkü 1/2şans olduğunu Askorları, bir 1/4şans olduğunu Aözlüyor ve Bskorları ve 1/4şans o bayan ve işlem tekrar ikisi). Eğer Asavunamazsa, elenir ve Bkazanır. Eğer Asavunur, daha sonra hat haline gelir B A. Durum simetrik olduğu için Akazanma olasılığı (1 - p). Biz:

p = 2/3 * (1 - p) + 1/3 * 0. Çözüyoruz p = 2/5. Çıktı 2/5 3/5veya olmalıdır 0.4 0.6.

Daha karmaşık örnekler yapma olasılığı ile yeterince iyi değilim.

Daha fazla test vakasına ihtiyacınız varsa, işte birkaç tane:

0.1 0.2 0.3 0.4 --> 0.01 0.12 0.25 0.62
0.99 0.99 --> 0.5 0.5 (it's not exact, but if you round to two decimal places, you get 0.5 and 0.5)

Yanıtlar:


4

CJam ( 84 80 karakter * 0.7 = 56)

{_,({_,,{_2$m<(;(+Q0\)\++m>\}%)_(+.{X2$-*_@+/}1\{1$*\1$-}%)1\-f/.f*:.+}{,da}?}:Q

Çevrimiçi demo . Bu, çiftler dizisini alan ve çiftler dizisini döndüren özyinelemeli bir işlevdir. Çevrimiçi demo, işlevi yürütmek ve çıktıyı görüntüleme için biçimlendirmek için çok az miktarda iskele içerir.

teşrih

Temel ilke, eğer n > 1kalan oyuncular varsa , bunlardan birinin atılacak bir sonraki oyuncu olması gerektiğidir. Dahası, bundan sonra sıranın sırası sadece sıranın ilk sırasına ve kimin nakavt edildiğine bağlıdır. Böylece nher seferinde her oyuncu için kazanma olasılığını hesaplayabilir ve daha sonra uygun şekilde ağırlıklandırmamız ve eklememiz gerekir.

Giriş olasılıklarını olarak etiketleyeceğim [p_0 p_1 ... p_{n-1}]. Let f(a,b)olasılığını göstermektedirler akarşı savunmak için başarısız b. Herhangi bir turda, olasılık olarak abaşarıyla savunur olduğunu p_a, bu olasılık bbayıltır açıktı (1-p_a)*p_bve başka yuvarlaktır için o gider olasılık (1-p_a)*(1-p_b). Geometrik bir ilerlemenin açık bir toplamını yapabiliriz ya da iki geometrik ilerlemenin bununla doğru orantılı olduğunu iddia edebiliriz f(a,b) = (1-p_a)*p_b / (p_a + (1-p_a)*p_b).

Sonra bir seviyeyi çizginin tüm turlarına yükseltebiliriz. İlk oyuncunun eleme olasılığı f(0,1); ikinci oyuncunun elenmesi olasılığı (1-f(0,1)) * f(1,2); üçüncü oyuncu (1-f(0,1)) * (1-f(1,2)) * f(2,3); vb sonuncusu olasılığı ile nakavt kadar \prod_i (1-f(i,i+1)) * f(n-1,0). Geometrik ilerlemeler hakkındaki aynı argüman, bu olasılıkları bir faktör tarafından normalleştirme ile ağırlık olarak kullanmamızı sağlar 1 / \prod_i f(i, i+1 mod n).

{                   e# Define a recursive function Q
  _,({              e# If we have more than one person left in the line...
    _,,{            e#   Map each i from 0 to n-1...
      _2$m<         e#     Rotate a copy of the probabilities left i times to get [p_i p_{i+1} ... p_{n-1} p_0 ... p_{i-1}]
      (;(+          e#     i fails to defend, leaving the line as [p_{i+2} ... p_{n-1} p_0 ... p_{i-1} p_{i+1}]
      Q             e#     Recursive call
      0\)\++        e#     Insert 0 for the probability of i winning and fix up the order
      m>\           e#     Rotate right i times and push under the list of probabilities
    }%
    )               e#   Stack: [probs if 0 knocked out, probs if 1 knocked out, ...] [p_0 p_1 ...]
    _(+.{           e#   Duplicate probs, rotate 1, and pointwise map block which calculates f(a,b)
      X2$-*_@+/     e#     f(a,b) = (1-p_a)*p_b / (p_a + (1-p_a)*p_b)  TODO is the d necessary?
    }
    1\{1$*\1$-}%    e#   Lift over the list of f(a,b) a cumulative product to get the weights  TODO is the d necessary?
    )1\-f/          e#   Normalise the weights
    .f*             e#   Pointwise map a multiplication of the probabilities for each case with the corresponding weight
    :.+             e#   Add the weights across the cases
  }{,da}?           e# ...else only one left, so return [1.0]
}:Q
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.