【问题标题】:How do you calculate the expected average of random values rounded to integers?您如何计算四舍五入为整数的随机值的预期平均值?
【发布时间】:2017-11-20 17:57:48
【问题描述】:

例如,考虑以下伪代码:

round(random(0.3, 1.9))

通过四舍五入到最接近的整数并随机生成介于 0.3 和 1.9 之间的统一浮点数,一百万个样本的平均值约为 1.125,而不是 1.1 的幼稚平均值。

如何在不实际生成几千个数字的情况下通过算法推导出该数字?

希望这不是一个微不足道的问题,但我似乎无法找到一个简单的解决方案。

【问题讨论】:

  • random(0.3, 1.9) 是否返回 0.3 到 1.9 之间的随机浮点数?回合是如何工作的?它是在 0.5 处取整还是基本上是 floor 函数?
  • 如果random 是统一的并且round 是下一个整数,那么平均值应该在(0.2*0+1.0*1+0.4*2)/1.6=1.8/1.6= 1.125。
  • @PatrickGünther 是的,它会生成一个介于 0.3 和 1.9 之间的随机浮点数,并且 round 只是四舍五入到最接近的整数。
  • @LutzL 四舍五入到最接近的整数。抱歉没有具体说明,我以为很清楚。
  • 那么请添加更多关于您如何达到平均水平的详细信息0.84611?您使用了多少个样本?

标签: math random language-agnostic


【解决方案1】:

这是一个相当通用的解决方案:

首先请注意,问题可以简化为计算(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] 中。在既不是A 也不是B 的情况下,floor(X) 的期望值因此是(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 和上面的公式仍然正确地将其作为预期值返回。

以下是一个 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

【讨论】:

  • 哇!感谢您提供全面的分步答案,以及最终解决方案。我正在尝试类似的事情,但我有一些细节错误,不知道如何解决。
【解决方案2】:

在[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.

【讨论】:

  • 我想我可以把它翻译成代码,但如果你不介意,你能在你的答案中包含一个伪代码函数吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-01
  • 1970-01-01
  • 2018-12-20
  • 2020-12-27
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
相关资源
最近更新 更多