我想使用泊松测试函数,根据给定的概率 p 发生或不发生事件。 Python的随机模块似乎没有这样的东西,因此我想出了
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)
您的功能显然无效:
>>> from collections import Counter
>>> Counter(poisson_test(0.5) for _ in range(10000))
Counter({True: 10000})
randrange
,与vanilla range
一样,排除 stop
参数,例如randrange(2)
将从不成为2
,因此该函数始终返回True
。
最小修正是:
if (random.randrange(p.denominator) + 1) <= p.numerator :
给出了更明智的结果:
>>> Counter(poisson_test(0.5) for _ in range(10000))
Counter({True: 5024, False: 4976})
或者,使用randint
,其中包含两个参数:
if random.randint(1, p.denominator) <= p.numerator :
但更简单的是:
import random
def poisson_test(p):
"""Poisson test with two possible outcomes, where p is success probability."""
return random.random() <= p
请注意每个the style guide在程序开头的docstring和import
的双引号。