Pólya urn flip and roll


13

Pernyataan masalah

Pólya bermain-main dengan guci-nya lagi dan dia ingin Anda membantunya menghitung beberapa probabilitas.

Dalam eksperimen guci ini Pólya memiliki guci yang awalnya berisi 1 manik merah dan 1 manik biru.

Untuk setiap iterasi, ia meraih dan mengambil manik, lalu memeriksa warna dan menempatkan manik kembali ke dalam guci.

Dia kemudian membalik koin yang adil, jika koin mendarat kepala dia akan memasukkan jumlah die roll adil 6 sisi dari manik berwarna sama ke dalam guci, jika itu mendarat ekor dia akan menghapus setengah jumlah manik berwarna sama dari guci ( Menggunakan pembagian integer - jadi jika jumlah manik-manik warna yang dipilih aneh, ia akan menghapus di (c-1)/2mana c adalah jumlah manik-manik warna itu)

Dengan bilangan bulat n ≥ 0 dan desimal r> 0, berikan probabilitas ke 2 tempat desimal bahwa rasio antara warna manik-manik setelah n iterasi lebih besar dari atau sama dengan r dalam jumlah byte terpendek.

Satu set contoh iterasi:

Biarkan (x, y) mendefinisikan guci sehingga berisi manik-manik x merah dan manik-manik biru.

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

Seperti yang dapat dilihat, Rasio selalu ≥ 1 (jadi lebih besar dari merah atau biru dibagi dengan yang lebih rendah)

Kasus uji:

Biarkan F (n, r) mendefinisikan aplikasi fungsi untuk n iterasi dan rasio 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

Ini adalah kode golf, jadi solusi terpendek dalam byte menang.


Saya merasa seperti ada formula untuk ini ...
Perwujudan Ketidaktahuan

Mungkin ada hubungannya dengan beta binomial, tetapi mungkin lebih lama untuk menuliskannya
Data Kedaluwarsa

tergantung pada bahasanya; R dan Mathematica mungkin dapat melakukannya secara efisien.
Giuseppe

Jawaban:


6

JavaScript (ES7),  145 ... 129 124  123 byte

Mengambil input sebagai (r)(n). Ini adalah solusi naif yang benar-benar melakukan seluruh simulasi.

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

Cobalah online!

Terlalu lambat untuk 2 kasus uji terakhir.

Berkomentar

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

Saya sangat suka jawaban ini, saya menemukan bahwa untuk menyelesaikan kasus pengujian nanti saya perlu menambahkan kode untuk menggabungkan probabilitas rasio yang sama. Jadi saya tidak terkejut itu terlalu lambat
Data Kadaluarsa

0

Bahasa Wolfram (Mathematica) , 133 byte

Length@Select[#2/#&@@@(r=Nest[Sort/@Flatten[Table[{{k,0}+#,⌈#/{1,2}⌉},{k,6}]&/@Join[#,Reverse/@#],2]&,{{1,1}},x]),#>=y&]/Length@r


Dengan menggunakan N[F,2] , output harus mencetak 2 angka desimal tetapi TIO mencetak lebih banyak ...

Cobalah online!

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.