绘制每分钟的平均动作

时间:2011-11-14 20:43:47

标签: php math graph

我正在使用谷歌图形库在php中创建一个图形来显示星际争霸II的APM数据,而我在思考这一切的逻辑时遇到了麻烦。我不确定这是最好的地方,但我没有选择。这有点难以解释,所以如果需要澄清,请告诉我。

我有一系列键和值。关键是以秒为单位的时间。该值是第二次执行的操作。我的数据源省略了带0操作的秒。 例如:

seconds     actions
1           10
3           5
4           7
7           15
etc         etc

我想要做的是绘制这些数据,显示每秒的平均每分钟动作数。直到第一分钟,我才会使用已经过的秒数。

这是我目前的代码

$p1_total = 0;
foreach ($p1 as $seconds => $actions) {
    $p1_total = $p1_total + $actions;
    $data['player1'][$seconds] = round($p1_total * 60 / $seconds);
}

然而,这会计算滚动平均值,因为它会增加$ p1_total,我真正需要的是每个时间间隔过去60秒的平均值。

我无法理解如何干净利落地编码。我知道我需要用过去60秒内的动作计数替换$ p1_total。但收集到底是什么让我感到高兴。如何在不处理大量变量的情况下动态设置它?请记住,我的秒数不是每秒,所以我不能只抓住数组中的最后60个条目,因为它们可能超过60秒。

我考虑过在数组中插入值以弥补空白点,但是没有合理的方法我可以想到而不会偏离平均值。 或者有一种方法可以用数学方法做到这一点。

我感谢所有可以提供帮助的人。如果有更多信息可以帮助,请告诉我。从表面上看,这感觉就像一个非常简单的问题,但它真的很难过。 :(

2 个答案:

答案 0 :(得分:2)

您可以插入零来弥补空白点,因为每次未在数据中表示时都会对应于执行零操作的秒。这可能是概念上最简单的方法。您不需要实际插入零;你可以做的是创建一个函数,如果它存在则返回$p1[$t],否则为0.然后只使用你的函数而不是直接访问$p1。 (我的PHP非常生疏,所以如果需要,请考虑这个类似PHP的伪代码)

function actions_at_second($t) {
    return ($t in $p1) ? $p1[$t] : 0;
}

请记住,即使您没有特定秒数的原始数据,这些秒数仍然会有非零的总操作次数。所以你应该每秒钟在最终的APM数组中创建一个数据点,无论是否执行了任何操作。

至于实际计算滚动平均值,您可以做的是在前60秒内迭代并将累积总数存储在输出数组中:

for ($t = 1; $t <= 60; $t++) {
    $total += actions_at_second($t);
    $data['player_1'][$t] = $total * 60 / $t;
}

(如果您的原始数据包含零秒的条目,则需要进行调整)然后在前60秒后,每次添加给定秒数的操作数量时,减去60秒前执行的操作数量: / p>

for ($t = 61; $t <= $tmax; $t++) {
    $total += actions_at_second($t) - actions_at_second($t - 60);
    $data['player_1'][$t] = $total;
}

$tmax将是您获得数据的最高秒数,基本上是游戏的长度。)我想在后一个示例中,$total不再代表完整的累计总数,所以你可以重命名它 - 但它必须与前一代码示例中的$total相同。

顺便说一句,我假设$tmax永远不会低于61.如果您要将此代码“放入野外”以供其他人使用,请务必检查案件(只是在早期投降的情况下)。

答案 1 :(得分:0)

这将循环遍历数组,只添加max(0,$current_time-60)和$ current_time . To get the average you need to divide by $ current_time之间的操作 - $ start_time which will be 60 or $ current_time {{1} } $ CURRENT_TIME if 60`。

is less than