Python中的随机测试模型

时间:2015-01-06 17:40:05

标签: python events testing random poisson

我想使用泊松测试函数,根据给定的概率 p 发生或不发生事件。 Python的随机模块似乎没有这样的东西,因此我想出了

  • 将概率 p 转换为分数
  • 随机选择一个整数。
  • 成功小于 - 或等于等于分母的整数范围内的分子。
但是,我相信这不是给定任务最有效的代码。我也怀疑它的正确性,尽管如此,我认为如果 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

任何建议???

谢谢!

1 个答案:

答案 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的双引号。