Xác suất Knockout


9

Knockout là một trò chơi bóng rổ, nơi người chơi thay phiên nhau bắn súng. Nó được chơi như một chuỗi các cuộc thi hai người chơi, mỗi cuộc thi có khả năng "hạ gục" một trong những người chơi đó.

Giả sử người chơi A B C Dvà cơ hội bắn và tạo rổ của họ 0.1 0.2 0.3 0.4tương ứng, độc lập với người chơi khác trong cuộc thi. Hai người chơi ở đầu hàng, AB, "chiến đấu". Kể từ khi Ađi trước, anh ta là người phòng thủ , có nguy cơ bị loại, và Bkẻ tấn công , và không có nguy cơ bị loại ngay lập tức. Abắn trước. Nếu Alàm cho nó, Ađã bảo vệ thành công, và đi đến phía sau của dòng. Dòng sẽ thay đổi thành B C D A. Nếu Akhông làm được thì Bbắn. Nếu Blàm cho nó, sau đó Alà ra và Bđi đến phía sau của dòng, vì vậy dòng trở thành C D B. Nếu khôngAcũng không Blàm cho nó, quá trình lặp lại, với Aviệc chụp lại, cho đến khi Ahoặc Blàm một cái giỏ.

Giả sử dòng thay đổi thành B C D A( Ađã bảo vệ thành công). Bây giờ, BC"chiến đấu", với Btư cách là người phòng thủ, và Clà kẻ tấn công. Quá trình này lặp lại cho đến khi chỉ còn một người. Người đó là người chiến thắng.

Nhiệm vụ của bạn là tính toán xác suất của mỗi người chiến thắng khi có cơ hội họ sẽ tạo ra một rổ.

Đầu vào :

Một danh sách các số, chẳng hạn như 0.1 0.2hoặc 0.5 0.5 0.5 0.5, trong đó số thứ n là cơ hội mà người chơi thứ n sẽ tạo ra một rổ. Bạn có thể lấy đầu vào này ở bất kỳ định dạng nào bạn thích, bao gồm làm tham số cho hàm.

Đầu ra :

Một danh sách các số, trong đó số thứ n là cơ hội mà người chơi thứ n sẽ giành chiến thắng trong trò chơi. Số của bạn phải chính xác đến ít nhất hai chữ số thập phân ít nhất 90% thời gian. Điều này có nghĩa là bạn có thể sử dụng một cách tiếp cận dựa trên mô phỏng. Tuy nhiên, nếu mã của bạn không dựa trên mô phỏng (nó được đảm bảo trả về câu trả lời đúng cho ít nhất 6 chữ số thập phân) thì lấy đi 30% từ điểm của bạn.

Ví dụ giữa 0.5 0.5: Gọi người chơi AB. Hãy plà xác suất của A chiến thắng. A2/3cơ hội bảo vệ thành công (vì có 1/2cơ hội Aghi bàn, 1/4cơ hội Abỏ lỡ và Bghi bàn, và 1/4cơ hội cả bỏ lỡ và quá trình lặp lại). Nếu Akhông phòng thủ, anh ta bị loại và Bchiến thắng. Nếu Abảo vệ, sau đó dòng trở thành B A. Vì tình huống là đối xứng, nên xác suất Achiến thắng là (1 - p). Chúng tôi nhận được:

p = 2/3 * (1 - p) + 1/3 * 0. Giải quyết, chúng tôi nhận được p = 2/5. Đầu ra nên 2/5 3/5hoặc 0.4 0.6.

Tôi không đủ tốt với xác suất để làm các ví dụ phức tạp hơn.

Nếu bạn cần thêm trường hợp thử nghiệm, đây là một vài:

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)

Câu trả lời:


4

CJam ( 84 80 ký tự * 0,7 = 56)

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

Bản demo trực tuyến . Đây là một hàm đệ quy có một mảng nhân đôi và trả về một mảng nhân đôi. Bản demo trực tuyến bao gồm một lượng nhỏ giàn giáo để thực hiện chức năng và định dạng đầu ra để hiển thị.

Mổ xẻ

Nguyên tắc cơ bản là nếu có n > 1người chơi còn lại, một trong số họ phải là người tiếp theo bị loại. Hơn nữa, thứ tự của hàng đợi sau đó xảy ra chỉ phụ thuộc vào thứ tự ban đầu của hàng đợi và người bị loại. Vì vậy, chúng tôi có thể thực hiện ncác cuộc gọi đệ quy, tính toán xác suất chiến thắng cho mỗi người chơi trong từng trường hợp và sau đó chúng tôi chỉ cần cân nhắc một cách thích hợp và thêm.

Tôi sẽ gắn nhãn xác suất đầu vào là [p_0 p_1 ... p_{n-1}]. Hãy f(a,b)biểu thị xác suất akhông thể chống lại b. Trong bất kỳ vòng nhất định, xác suất mà abảo vệ thành công là p_a, xác suất mà bara là (1-p_a)*p_b, và xác suất mà nó đi đến vòng khác là (1-p_a)*(1-p_b). Chúng ta có thể thực hiện một tổng hợp rõ ràng của một tiến trình hình học hoặc chúng ta có thể lập luận rằng hai tiến trình hình học tỷ lệ với nhau để lý giải điều đó f(a,b) = (1-p_a)*p_b / (p_a + (1-p_a)*p_b).

Sau đó, chúng ta có thể bước lên một cấp độ cho các vòng đầy đủ của dòng. Xác suất mà người chơi đầu tiên bị loại là f(0,1); xác suất người chơi thứ hai bị loại là (1-f(0,1)) * f(1,2); người chơi thứ ba là (1-f(0,1)) * (1-f(1,2)) * f(2,3); vv cho đến khi người cuối cùng bị loại ra với xác suất \prod_i (1-f(i,i+1)) * f(n-1,0). Lập luận tương tự về tiến trình hình học cho phép chúng ta sử dụng các xác suất này làm trọng số, với mức chuẩn hóa theo hệ số 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
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.