您如何计算四舍五入为整数的随机值的预期平均值?
How do you calculate the expected average of random values rounded to integers?
例如,考虑以下伪代码:
round(random(0.3, 1.9))
四舍五入到最接近的整数并随机生成一个介于 0.3 和 1.9 之间的统一浮点数,一百万个样本的平均值约为 1.125
,而不是 1.1
的朴素平均值.
如何在不实际生成几千个数字的情况下通过算法得出该数字?
希望这不是一个太微不足道的问题,但我似乎无法找到一个简单的解决方案。
在 [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.
这是一个相当通用的解决方案:
首先请注意,问题可以简化为计算 (a,b)
范围内随机数的下限期望值,因为 round(X)
的分布与floor(Y)
的分布,其中 Y = X + 0.5
(如果 X
是 U(a,b)
,则 Y
是 U(a+0.5,b+0.5)
)。减少到下限的好处是我们不需要根据 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)
包含至少 1 个整数。如果不是,则 pA
和 pB
的计算不正确,但在那种情况下 A = B = (A+B)/2
和上面的公式仍然正确 returns 这是预期的价值。
以下是R实现。第一个函数实现上述公式,第二个函数显示如何将舍入问题减少到它。如果你不知道 R,<-
是赋值运算符,函数定义中的最后一个表达式是返回值。
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
例如,考虑以下伪代码:
round(random(0.3, 1.9))
四舍五入到最接近的整数并随机生成一个介于 0.3 和 1.9 之间的统一浮点数,一百万个样本的平均值约为 1.125
,而不是 1.1
的朴素平均值.
如何在不实际生成几千个数字的情况下通过算法得出该数字?
希望这不是一个太微不足道的问题,但我似乎无法找到一个简单的解决方案。
在 [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.
这是一个相当通用的解决方案:
首先请注意,问题可以简化为计算 (a,b)
范围内随机数的下限期望值,因为 round(X)
的分布与floor(Y)
的分布,其中 Y = X + 0.5
(如果 X
是 U(a,b)
,则 Y
是 U(a+0.5,b+0.5)
)。减少到下限的好处是我们不需要根据 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)
包含至少 1 个整数。如果不是,则 pA
和 pB
的计算不正确,但在那种情况下 A = B = (A+B)/2
和上面的公式仍然正确 returns 这是预期的价值。
以下是R实现。第一个函数实现上述公式,第二个函数显示如何将舍入问题减少到它。如果你不知道 R,<-
是赋值运算符,函数定义中的最后一个表达式是返回值。
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