2015-01-06 7 views
0

주어진 확률에 따라 이벤트가 발생하거나 발생하지 않는 포아송 테스트 함수를 사용하고자합니다. p. 파이썬의 임의 모듈이 같은 뭔가를하지 않는 것, 따라서 나는 전원을 켜고 확률 페이지 일부 무작위로 Python의 무작위 테스트 모델

  • 정수를 선택에
    • 을 알아 냈어.
    • 성공은 분모와 같은 정수 범위의 분자보다 작거나 같습니다.

    하지만이 작업이 주어진 작업에 가장 효율적인 코드가 아니라고 생각합니다. 나는 또한 그것의 정확성에 대해서는 의문 스럽지만 그럼에도 불구하고 나는 random.randrange (int)이 균일 한 분포에 따라 작동한다고 생각한다.

    def poisson_test(p): 
    
        '''Poisson test with two possible outcomes, where p is success probability''' 
    
        import fractions 
    
        import random 
    
        from decimal import Decimal 
    
        p = Decimal('{0}'.format(p)) 
    
        p = fractions.Fraction(p) 
    
        if random.randrange(p.denominator) <= p.numerator : 
    
         return True 
    
        else: 
    
         return False 
    

    제안 사항 ???

    감사합니다.

  • +0

    나는 당신이하려고하는 것을 재고 할 필요가 있다고 생각합니다. 푸 아송 분포는 프로세스에 지정된 발생 비율이있는 경우 고정 간격으로 0, 1, 2, ... 발생을 관찰 할 확률을 나타냅니다. 당신이 묘사 한 것은 포아송이 아닙니다. 고정 된 성공 확률로 두 가지 결과, 성공 또는 실패가있는 경우 Bernoulli 확률 변수가 있습니다. – pjs

    답변

    0

    귀하의 기능을 명확하게입니다 작동하지 :

    >>> from collections import Counter 
    >>> Counter(poisson_test(0.5) for _ in range(10000)) 
    Counter({True: 10000}) 
    

    randrange, 바닐라 range, 제외stop 인수와 같은, 그래서 예를 들면, randrange(2)이 아니며2이되므로 함수는 항상 True을 반환합니다.

    최소한의 수정은 다음과 같습니다

    >>> Counter(poisson_test(0.5) for _ in range(10000)) 
    Counter({True: 5024, False: 4976}) 
    

    또는 두 매개 변수 포함 randint를 사용 :

    if random.randint(1, p.denominator) <= p.numerator : 
    

    하지만 훨씬 간단을 훨씬 더 합리적인 결과를 제공하는

    if (random.randrange(p.denominator) + 1) <= p.numerator : 
    

    이것입니다 :

    import random 
    
    def poisson_test(p): 
        """Poisson test with two possible outcomes, where p is success probability.""" 
        return random.random() <= p 
    

    프로그램 시작 부분에 docstring과 import을 큰 따옴표로 묶어주십시오 (the style guide).