heavenm 发表于 2019-10-26 01:06:40

脑筋急转弯,请问,如何计算30天数字的平均值!

本帖最后由 heavenm 于 2019-10-26 06:24 编辑

如何通过相临的2个数字计算平均值?现在要计算30天平均值,需要知道所有30天的数字,能不能每天计算平均值


Dim $avg
For $i=1 To 30
      $avg+=$i
Next
MsgBox(0, '', $avg/30)


heavenm 发表于 2019-10-26 01:11:15

本帖最后由 heavenm 于 2019-10-26 01:13 编辑

我想通过下一天的数字来计算全部的平均值!
不然每次计算平均值要计算30天的,太麻烦了!

用这个方法,小的数字是正确的
Dim $number =
Dim $avg = $number
For $i = 0 To UBound($number) - 2
      $avg += Abs($number[$i] - $number[$i + 1]) / 2
Next
MsgBox(0, '', $avg);等于2,正确的
数字一大就玩完了
Dim $number =
Dim $avg = $number
For $i = 0 To UBound($number) - 2
      $avg += Abs($number[$i] - $number[$i + 1]) / 2
Next
MsgBox(0, '', $avg);等于150,错误的,正确的应该是107

laycher 发表于 2019-10-26 13:23:35

正确不是应该是149.5吗?
Dim $avg = 0

heavenm 发表于 2019-10-26 14:47:15

laycher 发表于 2019-10-26 13:23
正确不是应该是149.5吗?
Dim $avg = 0

不是
1+22+300=323/3=107

这个算法是通过隔天的数据来计算平均值的,但是平均值和总体计算的平均值差距有点大

afan 发表于 2019-10-26 15:08:53

本帖最后由 afan 于 2019-10-26 16:56 编辑

1 22 300 是哪门子相邻数?非相邻数又如何不求和而计算平均值,这不是脑筋急转弯,是检测脑壳含水量…
BTW, 既然同样用For循环计算,那又为何不像一楼那样简单得出结果?

kevinch 发表于 2019-10-26 15:16:34

实际上第n天对于平均值的影响只有与前期平均值之差的1/n,楼主认为始终是2是错误的想法,并不是只有两天Dim $number =
Dim $avg = $number
For $i = 1 To UBound($number) - 1
      $avg += ($number[$i] - $avg) / ($i+1)
Next
MsgBox(0, '', $avg)

heavenm 发表于 2019-10-26 19:18:21

本帖最后由 heavenm 于 2019-10-26 19:19 编辑

afan 发表于 2019-10-26 15:08
1 22 300 是哪门子相邻数?非相邻数又如何不求和而计算平均值,这不是脑筋急转弯,是检测脑壳含水量…
BTW ...
:face (32):
我可能描述得难以理解
意思是相临的2天
1-30天,计算平均值,每天获取一个新的数字
要计算平均值现在就是把30天数据全部相加再除以天数!

一个数据在一个数据表里面,这样子要读30个表!所以想看看有没有直接通过下一天的数据来直接获取平均值。认真想想好像确实应该不可以额!貌似不是个脑筋急转弯,是个脑子撞墙!:face (9):

afan 发表于 2019-10-26 19:27:14

heavenm 发表于 2019-10-26 19:18
我可能描述得难以理解
意思是相临的2天
1-30天,计算平均值,每天获取一个新的数字


除非你保存已计算的平均值及数量,否则如果不是固定步进值的话只能从头加到尾再取均值

heavenm 发表于 2019-10-27 06:59:22

本帖最后由 heavenm 于 2019-10-27 07:13 编辑

kevinch 发表于 2019-10-26 15:16
实际上第n天对于平均值的影响只有与前期平均值之差的1/n,楼主认为始终是2是错误的想法,并不是只有两天
这个方法好像结果并不是指定天数的平均值,是长期的平均值!意外掌握另外一个东西,这个可以当作数字波动走向!固定周期的平均值应该还是要全部累加再除才行!
Dim $number =
Dim $avg = $number
For $i = 1 To UBound($number) - 1
      MsgBox(0, '',StringFormat('%s\n%s\n%s\n%s',$number[$i],$avg,($i + 1),($number[$i] - $avg) / ($i + 1)))
      $avg += ($number[$i] - $avg) / ($i + 1)
Next
MsgBox(0, '', $avg)


heavenm 发表于 2019-10-27 07:16:40

afan 发表于 2019-10-26 19:27
除非你保存已计算的平均值及数量,否则如果不是固定步进值的话只能从头加到尾再取均值

嗯是的!不过意外的掌握了另一个知识哈!还是很有意义的
页: [1]
查看完整版本: 脑筋急转弯,请问,如何计算30天数字的平均值!