求一个算平均数的算法

OSC688888 发布于 2015/01/19 11:22
阅读 427
收藏 1

需求是这样的,数据会记录用户每次的游戏分数,然后app上需要展示用户当前的平均分。

平均分=总分数/玩的次数。

这里我担心随着玩的次数越多,总分数会很大。

我现在是有个表专门记录平均分的,这样我就不用每次去计算总分和次数。

还有其他什么办法计算吗?


给个最早答的最佳答案吧!

加载中
1
0-1
0-1

依次输入x[0]....x[i-1]

avg = 0;

avg += (x[i]-avg)/i

0-1
0-1
回复 @OSC首席键客 : db记录用户当前平均值(avg), 总次数(cnt); 每新产生一条新记录(x, cnt++),和前面2个参数计算就可以了。可以用小程序跑一下。不过比较难理解和有取巧知县,还是用传统的sum/cnt就好, 注意大值情况(数据库字段类型设计)
OSC688888
OSC688888
循环每次玩的分数?
1
Feng_Yu
Feng_Yu

只记录玩的次数和平均分,下次有新数据上来了,刷新记录即可.

新平均分=(旧平均分*次数+新的分数)/次数+1

EDIT: 理解有偏差,再仔细想想.(PS,删除线标签<del>居然不起作用- -)

OSC688888
OSC688888
回复 @Royh-L : 你们这两个那个是对的? 我读书少,别骗我啊!
vvtf
vvtf
新平均分=(旧平均分*次数+新的分数)/(次数+1)
0
sxgkwei
sxgkwei

你这个首先记录在表中的,不能只记录平均分,还要记录这是第几次计算的平均分。

然后通过公式: 新平均分=(新分数-原平均分)/(次数+1)+原平均分

就可以计算出来新的平均分。这个公式计算时,可以规避掉数据过大导致溢出的情况。

欣儿
欣儿
你这个跟楼主选的正确答案那个一样,感觉很取巧,用在大数据上吗?
0
leo108
leo108

记平均分干啥,要记也是记总分和玩的次数,输出的时候再做个除法就行了。

另外,其实根本没必要记这个,只要对uid字段加一个索引,然后select avg(score) from 表 where uid = xxx 就行了,就算这个表是亿量级的,这个sql也会很快

OSC688888
OSC688888
其实我是把我的问题简化了的,只提了关键部分,实际情况不是就一个分数那么简单。
0
vvtf
vvtf

新平均分=(旧平均分*次数+新的分数)/(次数+1)

第一次,分数100,平均数为100×1/1

第二次,分数为80,平均数为(100×1+80)/(1+1)=90

第三次,分数为90,平均数为(90×2+90)/(2+1)=90

第N次,分数为M,平均数=(旧平均数×次数+M)/(次数+1)。

次数+1=N。

难道不对吗?

0
没手机的不配发言
没手机的不配发言
我觉得记录一个总次数,记录一个平均分, 当下次得分出来后,总次数+1。
然后  平均分-(平均分-下次得分)/总次数 =当前平均分。
返回顶部
顶部