Pólya urn lật và cuộn


13

Báo cáo vấn đề

Pólya đang chơi với chiếc bình của mình một lần nữa và anh ta muốn bạn giúp anh ta tính toán một số xác suất.

Trong thí nghiệm chiếc bình này, Pólya có một chiếc bình ban đầu chứa 1 hạt màu đỏ và 1 hạt màu xanh.

Đối với mỗi lần lặp lại, anh ta chạm vào và lấy ra một chuỗi hạt, sau đó kiểm tra màu sắc và đặt hạt trở lại trong bình.

Sau đó, anh ta ném một đồng xu công bằng, nếu đồng xu rơi xuống đầu anh ta sẽ nhét một lượng cuộn 6 mặt công bằng của hạt cùng màu vào chiếc bình, nếu nó rơi xuống đuôi, anh ta sẽ loại bỏ một nửa số hạt cùng màu khỏi chiếc bình ( Sử dụng phép chia số nguyên - vì vậy nếu số lượng hạt của màu được chọn là số lẻ, anh ta sẽ xóa (c-1)/2trong đó c là số lượng hạt của màu đó)

Cho số nguyên n ≥ 0 và số thập phân r> 0, đưa ra xác suất cho 2 vị trí thập phân rằng tỷ lệ giữa các màu của hạt sau n lần lặp lớn hơn hoặc bằng r trong số byte ngắn nhất.

Một ví dụ về các lần lặp:

Đặt (x, y) xác định urn sao cho nó chứa x hạt màu đỏ và hạt màu xanh y.

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

Có thể thấy Tỷ lệ r luôn là 1 (do đó, màu đỏ hoặc màu xanh dương chia cho số nhỏ hơn)

Các trường hợp thử nghiệm:

Đặt F (n, r) xác định ứng dụng của hàm cho n lần lặp và tỷ lệ 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

Đây là mã golf, vì vậy giải pháp ngắn nhất trong byte thắng.


Tôi cảm thấy như có một công thức cho việc này ...
Hiện thân của sự

Có thể làm gì đó với các nhị thức beta, nhưng có thể lâu hơn để viết nó ra
Dữ liệu đã hết hạn vào

phụ thuộc vào ngôn ngữ; R và Mathicala có thể làm điều đó một cách hiệu quả.
Giuseppe

Câu trả lời:


6

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

Đưa đầu vào là (r)(n). Đây là một giải pháp ngây thơ thực sự thực hiện toàn bộ mô phỏng.

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

Hãy thử trực tuyến!

Quá chậm cho 2 trường hợp thử nghiệm cuối cùng.

Đã bình luận

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

Tôi thực sự thích câu trả lời này, tôi thấy rằng để giải quyết các trường hợp kiểm tra sau này, tôi cần thêm mã để hợp nhất các xác suất tỷ lệ tương tự. Vì vậy, tôi không ngạc nhiên khi nó quá chậm
Dữ liệu hết hạn vào

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.