2012-12-24 2 views
1

이 문제를 해결하기위한 코드를 작성 중입니다 :복권 확률 파이썬 코드

귀하와 귀하의 친구들은 브로드 웨이 뮤지컬을 보러 갈 계획입니다. 불행히도, 뉴욕은 뉴욕으로, 표는 조금 비싸다. 그러나 쇼 중 하나에는 당신과 같은 미숙 한 사람들이 좋은 자리에 약간 저렴한 티켓을 살 권리를 얻을 수있는 티켓 복권이 매일 밤 있습니다. 추첨은 다음과 같이 운영됩니다. 첫째, 관심있는 모든 사람들이 추첨에 들어갑니다. 그런 다음 행운의 당첨자가 그려지고 각각은 t 표를 사기 위해 제공됩니다.

귀하의 그룹에 속한 사람들의 수 (모두 추첨에 들어 갔음)와 복권에 입사 한 총인수 m가 주어지면 전체 그룹에 대한 티켓을 얻을 수있는 확률은 얼마입니까? 행운의 당첨자는 복권에 입장 한 사람들로부터 무작위로 무작위로 선택되며 각 사람은 최대 한 번까지 이길 수 있다고 가정합니다.

여기 내 코드입니다 :

import math 

def lottery(): 

    m = int(raw_input('The number of people who entered the lottery: ')) 
    n = int(raw_input('The number of winner drawn from the total: ')) 
    t = int(raw_input('The number of tickets each winner can purchase: ')) 
    p = int(raw_input('The number of people in your group: ')) 

    def combinations(n, k): 
     if 0 <= k <= n: 
      ntok = 1 
      ktok = 1 
      for t in xrange(1, min(k, n - k) + 1): 
       ntok *= n 
       ktok *= t 
       n -= 1 
      return ntok // ktok 
     else: 
      return 0 

    needed_wins = int(math.ceil(p/t)) 

    others = m - p 

    loss = 0 
    for i in range(needed_wins): 
     loss += combinations(others, n-i) * combinations(p, i) 

    total = combinations(m, n) 

    prob = 1 - loss/total 

    print(prob) 

내가 그것을 실행하려고하지만 결과는 잘못 나왔다. 예를 들어, 조합이 (100,10,2,1)이면 결과는 0.1이어야합니다. 대신에 1을 반환했습니다. 누군가 나를 도와 줄 수 있다면 정말 고맙습니다.

+1

.... – jdotjdot

+0

정수 나누기를 itertools.combinations'로 보일 것입니다 –

+0

@LongPham은 "itertools가 정수 나누기에 대해 작동하지 않는다고 생각"하는 것에 대해 더 구체적으로 설명 할 수 있습니까? 'itertools.combinations()'에 대한 코멘트는 나눗셈과 관련된 것을 언급하지 않습니다. – Matt

답변

5

파이썬 2에서는 두 개의 정수를 나눌 때 항상 정수 결과를 얻습니다. 나눔의 int가 수레를 생산하는 당신에게 새로운 파이썬 3 동작을 얻을 것이다 파일의 상단에이 줄을 추가하십시오 :

from __future__ import division 
당신은`
+0

예, 작동했습니다! 고마워요! –

+0

@ LongPham 작동하는 경우 Ned의 답변을 수락하여 문제가 해결 된 것으로 표시되도록하십시오! –