这个标题有点绕口,问题是这样的,比如一个小时,按秒计算有3600秒。如果这1个小时有36次请求,那么就是1次请求/100秒,如果是360次请求,那么就是1次请求/10秒。
ok,如果是上面这样还挺好算,那在这个时间段里如何“均匀”划分31次请求,487次请求,7520次请求呢?你先想会,不过要注意哦:
那如何实现呢?你思考思考后再看看我下面的答案,这个答案也是来自网友的帮助,也许不是最简单的,如果你有更好的方法,希望你能告诉我。
把累积的小数误差体现在后面的计算中即可消灭最后的累积误差。
也就是说每次使用“剩余时间”和“剩余次数”而非“总时间”和“总次数”来计算,这样每次向下取整,剩余时间就会变多一些,后面就更倾向于向上取整一些,反之亦然。误差会在不超过正负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版:
'; 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]
如果你还有更好的算法,希望你留言告诉我~
您可能也喜欢: |
经典互斥算法解析 |
PHP算法3则 |
php提供的对称加密算法|Mcrypt.class.php |
PHP+MySQL应用中使用XOR运算加密算法 |
PHP获取远程web服务器时间的代码 |
无觅 |