介绍
在这个挑战中,您的任务是实现一组简单的函数,这些函数共同构成一个用于简单概率分布的可用小型库。为了适应人们喜欢在这里使用的一些更深奥的语言,可以接受以下实现:
- 定义命名函数(或最接近的对等函数)集合的代码段。
- 表达式集合,这些表达式的结果为命名或匿名函数(或最接近的等效函数)。
- 单个表达式,其结果为几个命名或匿名函数(或最接近的对等函数)。
- 独立程序的集合,这些独立程序从命令行,STDIN或最接近的等效项获取输入,并输出到STDOUT或最接近的等效项。
功能
您应实现以下功能,并根据需要使用较短的名称。
uniform
将两个浮点数a
和作为输入b
,并返回的均匀分布[a,b]
。你可以假设a < b
; 情况a ≥ b
是不确定的。blend
将三种概率分布作为输入P
,Q
和R
。它返回一个概率分布S
,其平值x
,y
和z
从P
,Q
和R
分别和的产率y
,如果x ≥ 0
和z
如果x < 0
。over
接受一个浮点数f
和一个概率分布作为输入P
,并返回从中抽取x ≥ f
的随机数所保持的概率。x
P
供参考,over
可以定义如下(以伪代码表示):
over(f, uniform(a, b)):
if f <= a: return 1.0
else if f >= b: return 0.0
else: return (b - f)/(b - a)
over(f, blend(P, Q, R)):
p = over(0.0, P)
return p*over(f, Q) + (1-p)*over(f, R)
您可以假定给定的所有概率分布over
都是使用uniform
和构造的blend
,并且用户要做的唯一事情就是将其提供给blend
或over
。您可以使用任何方便的数据类型来表示分布:数字,字符串,自定义对象等的列表。唯一重要的是API可以正常工作。同样,在始终为相同的输入返回相同的输出的意义上,您的实现必须是确定性的。
测试用例
在这些测试用例上,您的输出值应正确至小数点后至少两位数。
over(4.356, uniform(-4.873, 2.441)) -> 0.0
over(2.226, uniform(-1.922, 2.664)) -> 0.09550806803314438
over(-4.353, uniform(-7.929, -0.823)) -> 0.49676329862088375
over(-2.491, uniform(-0.340, 6.453)) -> 1.0
over(0.738, blend(uniform(-5.233, 3.384), uniform(2.767, 8.329), uniform(-2.769, 6.497))) -> 0.7701533851999125
over(-3.577, blend(uniform(-3.159, 0.070), blend(blend(uniform(-4.996, 4.851), uniform(-7.516, 1.455), uniform(-0.931, 7.292)), blend(uniform(-5.437, -0.738), uniform(-8.272, -2.316), uniform(-3.225, 1.201)), uniform(3.097, 6.792)), uniform(-8.215, 0.817))) -> 0.4976245638164541
over(3.243, blend(blend(uniform(-4.909, 2.003), uniform(-4.158, 4.622), blend(uniform(0.572, 5.874), uniform(-0.573, 4.716), blend(uniform(-5.279, 3.702), uniform(-6.564, 1.373), uniform(-6.585, 2.802)))), uniform(-3.148, 2.015), blend(uniform(-6.235, -5.629), uniform(-4.647, -1.056), uniform(-0.384, 2.050)))) -> 0.0
over(-3.020, blend(blend(uniform(-0.080, 6.148), blend(uniform(1.691, 6.439), uniform(-7.086, 2.158), uniform(3.423, 6.773)), uniform(-1.780, 2.381)), blend(uniform(-1.754, 1.943), uniform(-0.046, 6.327), blend(uniform(-6.667, 2.543), uniform(0.656, 7.903), blend(uniform(-8.673, 3.639), uniform(-7.606, 1.435), uniform(-5.138, -2.409)))), uniform(-8.008, -0.317))) -> 0.4487803553043079