IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    如何在一个时间内平均发起请求?!

    李惟发表于 2014-10-20 12:04:52
    love 0

    这个标题有点绕口,问题是这样的,比如一个小时,按秒计算有3600秒。如果这1个小时有36次请求,那么就是1次请求/100秒,如果是360次请求,那么就是1次请求/10秒。

    ok,如果是上面这样还挺好算,那在这个时间段里如何“均匀”划分31次请求,487次请求,7520次请求呢?你先想会,不过要注意哦:

    1. 不能有小数哦,必须是整数,因为实际情况就是以秒为单位来发起请求的哦。
    2. 你可别向上、或向下舍入哦,比如:3600秒有19次请求,那么就是1次请求/189.47秒,向上舍入1次请求/190秒,1个小时是发不完19次的哦;向下舍入1次请求/188秒,那么后面将会空余出28秒哦,这样就“不均分”了

    那如何实现呢?你思考思考后再看看我下面的答案,这个答案也是来自网友的帮助,也许不是最简单的,如果你有更好的方法,希望你能告诉我。

    把累积的小数误差体现在后面的计算中即可消灭最后的累积误差。

    也就是说每次使用“剩余时间”和“剩余次数”而非“总时间”和“总次数”来计算,这样每次向下取整,剩余时间就会变多一些,后面就更倾向于向上取整一些,反之亦然。误差会在不超过正负1的区间内摇摆而不会累积

    def scheduleRequest(reqCount, time = 3600):
        result = []
    
        remainTime = time
    
        for i in xrange(0, reqCount):
            t = round(remainTime / (reqCount - i))
    
            if(len(result) > 0):
                result.append(result[-1] + t)
            else:
                result.append(t)
    
            remainTime -= t
    
        return result
    
    print(scheduleRequest(11))
    print(scheduleRequest(12))
    print(scheduleRequest(13))
    print(scheduleRequest(73, 36))

    我将上面的代码修改成JS和PHP的,分别如下

    JS版:

    function scheduleRequest(reqCount, time) {
        !time && (time = 3600);
        var remainTime = time, result = [], t, l;
    
        for (var i = 0; i < reqCount; i++) {
            t = Math.round(remainTime / (reqCount - i));
            l = result.length;
            result.push(l ? result[l-1] + t : t);
            remainTime -= t;
        }
    
        return result;
    }
    
    scheduleRequest(11);
    scheduleRequest(12);
    scheduleRequest(13);
    scheduleRequest(73, 36);

    PHP版:

    <?php
    function scheduleRequest($reqCount, $time = 3600)
    {
    	$result = array();
    	$remainTime = $time;
    
    	for ($i = 0; $i < $reqCount; $i++)
    	{
    		$t = round($remainTime / ($reqCount - $i));
    		$l = count($result);
    
    		$result[] = $l ? $result[$l - 1] + $t : $t;
    		$remainTime -= $t;
    	}
    
    	return $result;
    }
    
    echo '<pre>';
    print_r(scheduleRequest(11));
    print_r(scheduleRequest(12));
    print_r(scheduleRequest(13));
    print_r(scheduleRequest(75, 36));

    打印结果如下:

    [327, 654, 981, 1308, 1635, 1963, 2290, 2618, 2945, 3273, 3600]
    [300, 600, 900, 1200, 1500, 1800, 2100, 2400, 2700, 3000, 3300, 3600]
    [277, 554, 831, 1108, 1385, 1662, 1939, 2216, 2493, 2770, 3047, 3324, 3600]
    [0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30, 30, 31, 31, 32, 32, 33, 33, 34, 34, 35, 35, 36, 36]

    如果你还有更好的算法,希望你留言告诉我~

    您可能也喜欢:

    240多个jQuery插件 功能强大 齐全

    Adobe Cleaner Tool:Adobe完全卸载工具

    Mac下配置Redis服务器(自启动、后台运行)

    通过 Google Docs 加密你的 Gmail 邮件

    linux使用crontab实现PHP执行定时任务
    无觅


沪ICP备19023445号-2号
友情链接