Pólya urn çevirme ve rulo


13

Sorun bildirimi

Pólya yine urnu ile oynuyor ve bazı olasılıkları hesaplamasına yardım etmenizi istiyor.

Bu urn deneyinde Pólya'nın başlangıçta 1 kırmızı ve 1 mavi boncuk içeren bir urnu vardır.

Her yinelemede, bir boncuğa ulaşır ve bir boncuk alır, ardından rengi inceler ve boncuğu tekrar urn'a yerleştirir.

Daha sonra adil bir madeni para çevirir, madeni para kafaya girerse, aynı renkli boncuğun 6 kenarlı adil bir rulo rulosunu urn'a yerleştirir, kuyruklara inerse aynı renkli boncuğun sayısının yarısını urndan çıkarır ( Tamsayı bölmesini kullanarak - seçilen rengin boncuk sayısı garip (c-1)/2ise, c, o rengin boncuk sayısı olduğu yerde çıkarır )

N ≥ 0 ve ondalık r> 0 tamsayısı verildiğinde, n yinelemeden sonra boncukların renkleri arasındaki oranın en kısa bayttaki r'den büyük veya ona eşit olması olasılığını 2 ondalık basamağa verin.

Örnek bir yineleme kümesi:

(X, y) urn'u x kırmızı boncuklar ve y mavi boncuklar içerecek şekilde tanımlasın.

Iteration    Urn       Ratio
0            (1,1)     1
1            (5,1)     5        //Red bead retrieved, coin flip heads, die roll 4
2            (5,1)     5        //Blue bead retrieved, coin flip tails
3            (3,1)     3        //Red bead retrieved, coin flip tails
4            (3,4)     1.333... //Blue bead retrieved, coin flip heads, die roll 3

Görüldüğü gibi r oranı her zaman ≥ 1'dir (bu nedenle kırmızı veya mavinin daha küçük olana bölünmesiyle daha büyüktür)

Test senaryoları:

F (n, r) n yinelemeleri için fonksiyonun uygulanmasını ve r oranını tanımlasın

F(0,5) = 0.00
F(1,2) = 0.50
F(1,3) = 0.42
F(5,5) = 0.28
F(10,4) = 0.31
F(40,6.25) = 0.14

Bu kod golf, bu yüzden bayttaki en kısa çözüm kazanır.


Bunun için bir formül varmış gibi hissediyorum ...
cehaletin somutlaşmışı

Belki beta binomials ile ilgili bir şey, ama bunu yazmak daha uzun olabilir
tarihi:

dile bağlıdır; R ve Mathematica bunu verimli bir şekilde yapabilir.
Giuseppe

Yanıtlar:


6

JavaScript (ES7),  145 ...  129124123 bayt

Girişi alır (r)(n). Bu, aslında tüm simülasyonu gerçekleştiren naif bir çözümdür.

r=>g=(n,B=s=0,R=0,h=d=>++d<7?h(d,[0,d].map(b=>g(n,B/-~!!b,R/-~!b)&g(n,B+b,R+d-b))):s/24**-~n)=>n--?h``:s+=~B<=r*~R|~R<=r*~B

Çevrimiçi deneyin!

Son 2 test vakası için çok yavaş.

Yorumlananlar

r =>                    // r = target ratio
g = (                   // g is a recursive function taking:
  n,                    //   n = number of iterations
  B =                   //   B = number of blue beads, minus 1
  s = 0,                //   s = number of times the target ratio was reached
  R = 0,                //   R = number of red beads, minus 1
  h = d =>              //   h = recursive function taking d = 6-sided die value
    ++d < 7 ?           // increment d; if d is less than or equal to 6:
      h(                //   do a recursive call to h:
        d,              //     using the new value of d
        [0, d].map(b => //     for b = 0 and b = d:
          g(            //       do a first recursive call to g:
            n,          //         leave n unchanged
            B / -~!!b,  //         divide B by 2 if b is not equal to 0
            R / -~!b    //         divide R by 2 if b is equal to 0
          ) & g(        //       do a second recursive call to g:
            n,          //         leave n unchanged
            B + b,      //         add b blue beads
            R + d - b   //         add d - b red beads
          )             //       end of recursive calls to g
        )               //     end of map()
      )                 //   end of recursive call to h
    :                   // else (d > 6):
      s / 24 ** -~n     //   stop recursion and return s / (24 ** (n + 1))
) =>                    // body of g:
  n-- ?                 //   decrement n; if n was not equal to 0:
    h``                 //     invoke h with d = [''] (coerced to 0)
  :                     //   else:
    s +=                //     increment s if:
      ~B <= r * ~R |    //       either (-B-1) <= r*(-R-1), i.e. (B+1)/(R+1) >= r
      ~R <= r * ~B      //       or     (-R-1) <= r*(-B-1), i.e. (R+1)/(B+1) >= r

Bu cevabı gerçekten beğendim, daha sonraki test senaryolarını çözmek için aynı oran olasılıklarını birleştirmek için kod eklemem gerektiğini buldum. Bu yüzden çok yavaş olduğuna şaşırmadım
Süresi dolmuş Veriler

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.