Python中的随机测试模型

Python中的随机测试模型,python,events,testing,random,poisson,Python,Events,Testing,Random,Poisson,我想使用泊松检验函数,根据给定的概率p,事件是否发生。Python的随机模块似乎没有这样的功能,因此我发现 把概率p变成分数 随机选取一个整数 成功是指在等于分母的整数范围内,小于或等于分子 一、 然而,我相信对于给定的任务来说,这不是最有效的代码。我也怀疑它的正确性,尽管如此,我认为它应该是随机的 def泊松试验(p): “两种可能结果的泊松检验,其中p为成功概率” 进口分数 随机输入 从十进制输入十进制 p=十进制({0})。格式(p)) p=分数。分数(p) 如果random.rand

我想使用泊松检验函数,根据给定的概率p,事件是否发生。Python的随机模块似乎没有这样的功能,因此我发现

  • 把概率p变成分数
  • 随机选取一个整数
  • 成功是指在等于分母的整数范围内,小于或等于分子
一、 然而,我相信对于给定的任务来说,这不是最有效的代码。我也怀疑它的正确性,尽管如此,我认为它应该是随机的

def泊松试验(p):
“两种可能结果的泊松检验,其中p为成功概率”
进口分数
随机输入
从十进制输入十进制
p=十进制({0})。格式(p))
p=分数。分数(p)
如果random.randrange(p.分母)您的函数显然不起作用:

>>> from collections import Counter
>>> Counter(poisson_test(0.5) for _ in range(10000))
Counter({True: 10000})
与vanilla一样,它排除了
stop
参数,因此,例如
randrange(2)
永远be
2
,因此函数始终返回
True

最基本的解决方案是:

if (random.randrange(p.denominator) + 1) <= p.numerator :
或者,使用,其中包括两个参数:

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

if random.randint(1,p.deminator)我认为您需要重新考虑您试图做什么。泊松分布描述了你观察到0,1,2,。。。给定进程具有指定的发生率,以固定的时间间隔发生。你所描述的不是泊松分布。如果有两种结果,成功或失败,有固定的成功概率,那么就有一个伯努利随机变量。
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