Python中的随机测试模型
random testing model in Python
我想使用泊松检验函数,根据给定的概率 p 判断事件是否发生。 Python的random模块好像没有这样的东西,所以我想通了
- 将概率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
有什么建议吗???
谢谢!
您的功能显然不起作用:
>>> from collections import Counter
>>> Counter(poisson_test(0.5) for _ in range(10000))
Counter({True: 10000})
randrange
, like vanilla range
、排除 stop
参数,例如randrange(2)
将 永远不会 成为 2
因此函数总是 returns 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
注意文档字符串的双引号和程序开头的 import
,根据 the style guide。
我想使用泊松检验函数,根据给定的概率 p 判断事件是否发生。 Python的random模块好像没有这样的东西,所以我想通了
- 将概率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
有什么建议吗???
谢谢!
您的功能显然不起作用:
>>> from collections import Counter
>>> Counter(poisson_test(0.5) for _ in range(10000))
Counter({True: 10000})
randrange
, like vanilla range
、排除 stop
参数,例如randrange(2)
将 永远不会 成为 2
因此函数总是 returns 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
注意文档字符串的双引号和程序开头的 import
,根据 the style guide。