例如,请考虑以下伪代码:
round(random(0.3, 1.9))
使用舍入到最接近的整数并随机生成0.3到1.9之间的均匀浮点数,一百万个样本的平均值大约为1.125
,而不是1.1
的天真平均值。< / p>
如何在不实际生成数千个数字的情况下通过算法推导出这个数字?
希望这不是一个小问题,但我似乎无法找到一个简单的解决方案。
答案 0 :(得分:2)
这是一个相当普遍的解决方案:
首先请注意,由于(a,b)
的分布与round(X)
的分布相同,因此问题可以减少到计算floor(Y)
范围内随机数的最低值的预期值的问题。 Y = X + 0.5
Y
U(a+0.5,b+0.5)
X
U(a,b)
a
b
。A = floor(a)
B = floor(b)
pA = (A + 1 - a)/(b-a)
pB = (b-B)/(b-a)
降低到最低限度的优势在于我们不需要根据每个向上或向下舍入的pA
或A
进入案例。
让:
pB
B
是A
的概率,B
是[A+1,B-1]
的概率。如果floor(X)
和A
以外的整数是可能的,那么它们将在B
区间内均匀分布。 (A+B)/2
的预期值,因为它既不是E(floor(X)) = pA*A + pB*B + (1-pA-pB)*(A+B)/2
也不是(a,b)
,因此pA
。这种条件期望需要通过这种值发生的概率加权。把这一切放在一起我们有:
pB
有一些细微之处。上述参数隐含地假设A = B = (A+B)/2
包含至少1个整数。如果它没有,则<-
和efloor <- function(a,b){
A <- floor(a)
B <- floor(b)
pA <- (A+1-a)/(b-a)
pB <- (b-B)/(b-a)
pA*A + pB*B + (1-pA-pB)*(A+B)/2
}
eround <- function(a,b){
efloor(a+0.5,b+0.5)
}
的计算不正确,但在这种情况下> eround(0.3,1.9)
[1] 1.125
并且上述公式仍然正确地将其返回为预期值。
以下是R实现。第一个函数实现上面的公式,第二个函数显示如何减少舍入问题。如果您不了解R,template
是赋值运算符,函数定义中的最后一个表达式是返回值。
templateUrl
例如,
template
答案 1 :(得分:0)
在[0.3,0.5)
上,您获得值0
,[0.5,1.5)
值1
和[1.5,1.9)
值2
。由于随机数是均匀的,它们的概率与区间长度成正比,全长为1.9-0.3=1.6
。因此,理论平均值是
0.2/1.6*0 + 1.0/1.6*1 + 0.4/1.6 * 2 = 1.8/1.6 = 1.125.