녹아웃 확률


9

녹아웃은 플레이어가 차례대로 총을 쏘는 농구 게임입니다. 이 게임은 2 인 컨테스트의 순서로 진행되며, 각 컨테스트는 해당 플레이어 중 한 명을 녹아웃 할 수 있습니다.

플레이어가 대회에서 다른 플레이어와 독립적으로 A B C D촬영하고 바구니를 만들 기회가 0.1 0.2 0.3 0.4각각 있다고 가정합니다 . 두 줄의 앞에 선수, A그리고 B"싸움." 이후 A첫번째 간다, 그는입니다 수비수 제거 될 위험에, 그리고 B는 IS 공격자 , 그리고 즉시 제거의 위험이있다. A먼저 쏴. 경우 A그것을하게, A성공적으로 방어하고, 라인의 뒤쪽으로 이동했다. 줄이로 바뀝니다 B C D A. 만약 A그것을하지 않습니다, 다음 B촬영. 만약 B그것을 만들고 나면 줄 A밖으로 나오고 B줄이됩니다 C D B. 그렇지 않다면A또는 바구니를 만들 때까지 다시 촬영 B하면서 프로세스가 반복 되지도 않습니다 .AAB

줄이 B C D A( A성공적으로 변했다고) 가정 해 보자 . 이제 BC"전투"와 B수비수 인, 그리고 C공격자 것. 이 과정은 한 사람 만 남을 때까지 반복됩니다. 그 사람이 승자입니다.

당신의 임무는 그들이 바구니를 만들 수있는 기회를 주어진 각 사람의 확률을 계산하는 것입니다.

입력 :

같은 번호의 목록 0.1 0.2또는 0.5 0.5 0.5 0.51, n은 일 수는있는 기회입니다 N 번째 선수가 바구니를 만들 것입니다. 이 입력은 함수의 매개 변수를 포함하여 원하는 형식으로 가져올 수 있습니다.

출력 :

숫자, 목록 , n은 일 수는있는 기회입니다 N 번째 플레이어가 게임에서 승리합니다. 숫자는 시간의 90 % 이상에서 소수점 이하 두 자리까지 정확해야합니다. 이는 시뮬레이션 기반 접근 방식을 사용할 수 있음을 의미합니다. 그러나 코드가 시뮬레이션 기반이 아닌 경우 ( 소수점 6 자리 이상으로 정답을 보증 함) 점수에서 30 %를 빼십시오.

0.5 0.5: 플레이어에게 전화 AB겁니다. pA의 승리 확률을 보자 . A2/3성공적으로 방어의 기회를 (A가 이후 1/2기회가 A점수를하는 1/4기회가 A미스와 B점수, 그리고 1/4기회가 미스 프로세스 반복 둘 다). 경우 A방어에 실패, 그는 기절하고 B승리. 경우 A방어, 해, 행이된다 B A. 상황이 대칭이기 때문에 A이길 확률은 입니다 (1 - p). 우리는 얻는다 :

p = 2/3 * (1 - p) + 1/3 * 0. 해결, 우리는 얻는다 p = 2/5. 출력은 2/5 3/5또는 이어야합니다 0.4 0.6.

더 복잡한 예제를 수행 할 확률이 충분하지 않습니다.

더 많은 테스트 사례가 필요한 경우 다음과 같습니다.

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)

답변:


4

CJam ( 84 80 자 * 0.7 = 56)

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

온라인 데모 . 이것은 복식 배열을 취하고 복식 배열을 반환하는 재귀 함수입니다. 온라인 데모에는 기능을 실행하고 표시 할 출력 형식을 지정하기위한 소량의 스캐 폴딩이 포함되어 있습니다.

해부

기본 원칙은 n > 1플레이어가 남아 있으면 그중 하나가 다음에 나올 수 있다는 것입니다. 또한, 그 후 큐의 순서는 큐의 초기 순서와 누가 기절했는지에 달려 있습니다. 그래서 우리는 n재귀 호출 을 할 수 있고 , 각 경우에 각 플레이어의 승리 확률을 계산할 수 있으며, 적절한 가중치를 부여하고 추가하면됩니다.

입력 확률에로 레이블을 지정합니다 [p_0 p_1 ... p_{n-1}]. 하자 f(a,b)확률 나타낸다 a방어에 실패합니다 b. 주어진 라운드에서 a성공적으로 방어 할 확률 은 p_a이고, b녹아웃 확률 a은이며 (1-p_a)*p_b, 다른 라운드로 갈 확률은 (1-p_a)*(1-p_b)입니다. 우리는 기하학적 진행의 명시적인 합을 수행하거나 두 가지 기하학적 진행이 그 이유에 비례한다고 주장 할 수 있습니다 f(a,b) = (1-p_a)*p_b / (p_a + (1-p_a)*p_b).

그런 다음 라인의 전체 라운드로 레벨을 올릴 수 있습니다. 첫 번째 플레이어가 기절 할 확률은 f(0,1); 두 번째 플레이어가 녹아웃 될 확률은 다음과 같습니다 (1-f(0,1)) * f(1,2). 세번째 선수는 (1-f(0,1)) * (1-f(1,2)) * f(2,3); 등 마지막은 확률로 기절 할 때까지 \prod_i (1-f(i,i+1)) * f(n-1,0). 기하 진행에 대한 동일한 주장을 통해 우리는 이러한 확률을 가중치로 사용하여 정규화를 인수로 사용할 수 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.