문 상을 수상 할 수있는 기회는 무엇입니까?


12

지역 ACM 장은 회의에 참석 한 사람들에게 상을 수여합니다. 당신은 당신이 프로그래밍 퍼즐을 해결하면 (하지만 그러나 승리의 증가 기회를 얻을 나는 항상 그 퍼즐을 해결 참조). 따라서 어떤 사람들에게는 1 개의 항목이 있고 다른 사람들에게는 2 개의 항목이 있습니다. 그러나 기다리십시오! 추첨 프로그램이 작동하는 방식은 누군가 퍼즐을 풀 때 다른 항목을 추가하는 것이 아닙니다. 대신, 사람이 가진 "생명"의 수를 추적하여 그 사람이 무작위 샘플링 알고리즘의 각 패스에서 선택되면 그 수가 줄어 듭니다. 따라서 다음과 같이 작동합니다.

Doorknob: 1.  xnor: 2.  Justin: 2.  Alex: 1.  Dennis: 2.

그런 다음 프로그램은 무작위로 중 하나를 선택 [Doorknob, xnor, Justin, Alex, Dennis]하고 숫자를 줄입니다 (예 Justin: 선택 ).

Doorknob: 1.  xnor: 2.  Justin: 1.  Alex: 1. Dennis: 2.

그리고 반복합니다. 누군가의 "생명"수가 지나면 0( Justin다시 선택하자 ) 목록에서 제거됩니다.

Doorknob: 1.  xnor: 2.  Alex: 1.  Dennis: 2.

이것은 한 사람이 남을 때까지 계속됩니다. 그 사람이 승자입니다.

이제 진짜 질문은, 내가 이겼을 확률은 얼마입니까?


두 가지 입력이 제공됩니다.

  • n. 이것은 도전에 참여한 사람들의 수입니다
  • k. 이것은 n2 명의 생명 을 가진 사람들의 수입니다 . 이 번호는 항상 당신을 포함합니다.

따라서 제가 기능 p을 가지고이라고 p(10, 5)한다면, 총 10 명, 5 명은 1 명, 5 명 (2 명)은 2 명에게 상을받을 확률입니다.


당신은 정확하게 또는 십진법으로 이길 확률을 출력해야합니다. 어쨌든, 답은 4를 포함하여 정확한까지이어야합니다 번째 소수점 이후 소수의 장소. 해당 숫자로 반올림하는지 여부는 귀하에게 달려 있습니다.

귀하의 솔루션은 확률높은 4 번째 소수에 대한 답변을 출력하는 무작위 솔루션 일 수 있습니다 . 사용하는 내장 RNG가 실제로 임의적이라고 가정하고 최소 90 % 확률로 정답을 출력해야합니다.

또한 n, k <= 1000궁금한 것보다 큰 테스트 사례를 제공했지만 코드는에만 작동해야합니다 .


테스트 사례

참고 :이 중 일부는 일반 공식입니다.

n,    k   |  output
----------+---------
1,    1   |  1
2,    2   |  0.5
2,    1   |  0.75
3,    1   |  11/18 = 0.611111111
1000, 1   |  0.007485470860550352
4,    3   |  0.3052662037037037
k,    k   |  1/k
n,    1   |  (EulerGamma + PolyGamma[1 + n])/n    (* Mathematica code *)
          |  (γ + ψ(1 + n))/n
10,   6   |  0.14424629234373537
300,  100 |  0.007871966408910648
500,  200 |  0.004218184180294532
1000, 500 |  0.0018008560286627948
---------------------------------- Extra (not needed to be a valid answer)
5000, 601 |  0.0009518052922680399
5000, 901 |  0.0007632938197806958

다른 몇 가지 확인 사항 p(n, 1) * n은 다음과 같이 수행하십시오.

n     |  output
------+---------
1     | 1
2     | 1.5 
3     | 1.8333333333333335
10    | 2.928968253968254
100   | 5.1873775176396215
-------------------------- Extra (not needed to be a valid answer)
100000| 12.090146129863305

더 이상이 사이트의 태그에 익숙하지 않습니다. 더 적절한 태그를 생각하면 수정하십시오!
Justin

math.se와 밀접한 관련이있는 질문 : math.stackexchange.com/q/1669715/72616
Justin

따라서 P (n, k) = ((k-1) / n) P (n, k-1) + ((nk) / n) P (n-1, k) + (1 / n) Q ( n, k-1), 여기서 Q (n, k) = ((nk-1) / n) Q (n-1, k) + (k / n) Q (n, k-1) 및 Q (1 , 0) = 1 ...
Leaky Nun

@KennyLau 나는 그것을 해석하려고하지는 않지만, 약간 다른 함수 정의를 사용하기 때문에 math.se 링크를 조심하십시오 (저는 k하나만 생각합니다 )
Justin

2
물론, 확실하지는 않지만, 확률이 높은 네 번째 소수점까지 정확한 답을 얻을 수있는 충분한 시도로 무작위 시뮬레이션을 수행해도 괜찮습니까?
xnor

답변:


2

MATL , 42 바이트

:<~QXJx`J`tf1Zry0*1b(-tzq]f1=vts3e8<]6L)Ym

이것은 확률 론적 (Monte Carlo) 접근법을 사용합니다. 실험은 확률이 추정되는 많은 횟수로 실행됩니다. 실현 횟수는 결과가 최소 90 %의 확률로 네 번째 10 진수까지 정확 하도록 하기 위해 선택됩니다 . 그러나이 작업에는 시간이 오래 걸리고 많은 메모리가 필요합니다. 아래 링크에서 실현 횟수가 10 6 배 감소 하여 프로그램이 합리적인 시간 내에 종료됩니다. 오직 진수는 적어도 90 %의 확률로 정확한 것으로 보장된다.

편집 (2016 년 7 월 29 일) : 언어 변경으로 인해로 6L교체해야합니다 3L. 아래 링크에는 해당 수정 사항이 포함되어 있습니다.

온라인으로 사용해보십시오!

배경

하자 P는 확률이 계산 될 나타낸다. 챌린지에 설명 된 실험은 n 번 실행됩니다 . 매번, 당신은 상을 받거나 (“ 성공 ”) 그렇지 않습니다. N 을 성공 횟수로 하자 . 원하는 확률은 Nn 에서 추정 할 수 있습니다 . n 이 클수록 추정이 더 정확합니다. 핵심 질문은 원하는 정확도를 달성하기 위해 n 을 선택하는 방법 , 즉 오류의 90 % 이상이 10 -4 미만이되도록하는 방법 입니다.

몬테카를로 방법은

  • 고정 크기 : n 값은 미리 고정 된 다음 N 은 임의입니다.
  • 가변 크기 : n 은 시뮬레이션 결과에 의해 즉석에서 결정됩니다.

두 번째 범주 중 일반적으로 사용되는 방법은 N (원하는 성공 횟수 )을 수정 하고 해당 성공 횟수가 달성 될 때까지 계속 시뮬레이션하는 것 입니다. 따라서 n 은 무작위입니다. 역 이항 샘플링 또는 음 이항 Monte Carlo 라고하는이 기술 은 추정기의 정확도를 제한 할 수 있다는 장점이 있습니다. 이러한 이유로 여기에서 사용됩니다.

구체적으로, 음 이항 몬테카를로와 함께 x = ( N -1) / ( n -1)은 p 의 바이어스되지 않은 추정기 이고; x 가 주어진 비율 이상으로 p 로부터 벗어날 확률은 상한 일 수있다. 이 논문의 식 (1)에 따르면 ( 조건 (2)도 충족 됨) N = 2.75 · 10 8 이상을 취 하면 p / x가 90 % 이상 간격 [1.0001, 0.9999]에 속합니다. 개연성. 특히, 이것은 원하는대로 x 가 90 % 이상의 확률로 소수점 이하 4 자리까지 정확함을 의미합니다 .

코드 설명

코드는 N = 3e8를 사용 하여 1 바이트를 저장합니다. 이 많은 시뮬레이션을 수행하는 데 시간이 오래 걸립니다. 링크의 코드는 N =을 사용하는데 300, 이는보다 합리적인 시간 (첫 번째 테스트 사례의 온라인 컴파일러에서 1 분 미만)으로 실행됩니다. 그러나 이것은 첫 번째 십진수가 적어도 90 %의 확률로 정확 하다는 것을 보장합니다 .

:        % Take k implicitly. Range [1 ... k]
<~       % Take n implicitly. Determine if each element in the previous array is
         % less than or equal than n
Q        % Add 1. This gives an array [2 ... 2 1 ... 1]
XJx      % Copy to clipboard J. Delete from stack
`        % Do...while. Each iteration is a Monte Carlo realization, until the 
         % desired nunber of successes is reached
  J      %   Push previously computed array [2 ... 2 1 ... 1]
  `      %   Do...while. Each iteration picks one door and decrements it, until
         %   there is only one
    t    %     Duplicate
    f    %     Indices of non-zero elements of array
    1Zr  %     Choose one of them randomly with uniform distribution
    y0*  %     Copy of array with all values set to 0
    1b(  %     Assign 1 to chosen index
    -    %     Subtract
    tzq  %     Duplicate. Number of nonzero elements minus 1. This is falsy if
         %     there was only one nonzero value; in this case the loop is exited
  ]      %   End do...while
  f1=    %   Index of chosen door. True if it was 1 (success), 0 otherwise
  v      %   Concatenate vertically to results from previous realizations
  ts3e8< %   Duplicate. Is the sum less than 3e8? If so, the loop is exited
]        % End do...while
6L)      % Remove last value (which is always 1)
Ym       % Compute mean. This gives (N-1)/(n-1). Implicitly display

하하 나는 90 % :-) 어려운 것을 그것을 만들 것이라고 몰랐어요
저스틴

네, 네 번째 는 90 % 신뢰 진수는 정말 강한 요구 사항은 :-)입니다
루이스 Mendo

2

Pyth, 34 바이트

Mc|!*HJ-GHch*J+*tHgGtH*gtGHKh-GHKG

테스트 스위트

n , k 를 인수로 사용 하여 결정적인 메모리 화 된 재귀 함수 g를 정의합니다 . 약 18 초 후에 반환 됩니다 (온라인 통역사가 시간 초과되므로 위의 테스트 스위트에 포함되지 않음).g 1000 5000.0018008560286627952

대략적인 Python 3 번역은

@memoized
def g(n,k):
    return (not k*(n-k) or (1+(n-k)*((k-1)*g(n,k-1)+g(n-1,k)*(n-k+1)))/(n-k+1))/n

1

자바 스크립트 (ES6), 65 바이트

f=(n,k,d=n-k)=>(!d||(f(n-1,k)*++d*--d+1+(--k&&f(n,k)*k*d))/++d)/n

그래도 큰 숫자로 시도하지 마십시오. f (30, 10)조차도 눈에 띄는 시간이 걸립니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.