Pólya urn flip and roll


13

Opis problemu

Pólya znów bawi się swoją urną i chce, żebyś pomógł mu obliczyć pewne prawdopodobieństwa.

W tym eksperymencie z urną Pólya ma urnę, która początkowo zawiera 1 czerwony i 1 niebieski koralik.

Podczas każdej iteracji sięga i pobiera koralik, a następnie sprawdza kolor i umieszcza koralik z powrotem w urnie.

Następnie rzuca uczciwą monetą, jeśli moneta wyląduje na głowach, wstawi do urny rzetelną 6-stronną ilość rzutu kostką tego samego koloru koralika, jeśli wyląduje na ogonie, usunie z urny połowę liczby koralików tego samego koloru ( Używając podziału na liczby całkowite - więc jeśli liczba kulek wybranego koloru jest nieparzysta, usunie (c-1)/2gdzie c jest liczbą kulek tego koloru)

Biorąc pod uwagę liczbę całkowitą n ≥ 0 i dziesiętną wartość r> 0, daj prawdopodobieństwo 2 miejscami po przecinku, że stosunek między kolorami perełek po iteracjach n jest większy lub równy r w najmniejszej liczbie bajtów.

Przykładowy zestaw iteracji:

Niech (x, y) zdefiniuje urnę tak, aby zawierała x czerwonych koralików i y niebieskich koralików.

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

Jak widać, stosunek r wynosi zawsze ≥ 1 (więc jest większy od czerwonego lub niebieskiego podzielony przez mniejszy)

Przypadki testowe:

Niech F (n, r) zdefiniuje zastosowanie funkcji dla iteracji i stosunek r

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

To jest golf golfowy, więc wygrywa najkrótsze rozwiązanie w bajtach.


Wydaje mi się, że istnieje na to formuła ...
Embodiment of Ignorance

Być może ma to coś wspólnego z dwumianami beta, ale może być dłużej, aby to napisać
Data

zależy od języka; R i Mathematica mogą to zrobić skutecznie.
Giuseppe

Odpowiedzi:


6

JavaScript (ES7),  145 ... 129 124  123 bajtów

Pobiera dane wejściowe jako (r)(n). To naiwne rozwiązanie, które faktycznie wykonuje całą symulację.

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

Wypróbuj online!

Zbyt wolno dla ostatnich 2 przypadków testowych.

Skomentował

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

Naprawdę podoba mi się ta odpowiedź, stwierdziłem, że aby rozwiązać późniejsze przypadki testowe, musiałem dodać kod, aby połączyć te same prawdopodobieństwa proporcji. Więc nie jestem zaskoczony, że jest zbyt wolny
Data

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.