0

问题很简单:

  • 一个小时有3600秒,就以这个为单位,按照每秒来的方式发起请求
  • 如果在这个期间有36次请求,那么就是1次/100秒,如果有360次请求,就是1次/10秒

这个不难,那如果说:

  • 3600秒有19次请求,那么就是189.47次,那肯定不可能是1次/189.47秒,因为是按照秒来发起请求的,但是如果按照1次/190秒来算,那在3600秒里面肯定是完不成19次请求的,如果按照1次/188秒来算,就分配的不是特别均匀(后面还空出28秒),也就是说如何尽可能的将19均分在3600上,然后面空出的数字越少越好
  • 如果说3600秒请求7520次请求,如何能算出每秒需发起多少次请求才能平均且合理呢?
  • 如果说3600秒请求31次请求,如何能算出多少秒发起一次请求比较平均且合理呢?

1个回答

0

已采纳

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

也就是说每次使用“剩余时间”和“剩余次数”而非“总时间”和“总次数”来计算,这样每次向下取整,剩余时间就会变多一些,后面就更倾向于向上取整一些,反之亦然。误差会在不超过正负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))

结果(最后那个请求次数超过时间两倍的例子,为了展示方便缩减为36秒)

[327.0, 654.0, 981.0, 1308.0, 1635.0, 1963.0, 2290.0, 2618.0, 2945.0, 3273.0, 3600.0]
[300.0, 600.0, 900.0, 1200.0, 1500.0, 1800.0, 2100.0, 2400.0, 2700.0, 3000.0, 3300.0, 3600.0]
[276.0, 553.0, 830.0, 1107.0, 1384.0, 1661.0, 1938.0, 2215.0, 2492.0, 2769.0, 3046.0, 3323.0, 3600.0]
[0.0, 1.0, 1.0, 2.0, 2.0, 3.0, 3.0, 4.0, 4.0, 5.0, 5.0, 6.0, 6.0, 7.0, 7.0, 8.0, 8.0, 9.0, 9.0, 10.0, 10.0, 11.0, 11.0, 12.0, 12.0, 13.0, 13.0, 14.0, 14.0, 15.0, 15.0, 16.0, 16.0, 17.0, 17.0, 18.0, 18.0, 19.0, 19.0, 20.0, 20.0, 21.0, 21.0, 22.0, 22.0, 23.0, 23.0, 24.0, 24.0, 25.0, 25.0, 26.0, 26.0, 27.0, 27.0, 28.0, 28.0, 29.0, 29.0, 30.0, 30.0, 31.0, 31.0, 32.0, 32.0, 33.0, 33.0, 34.0, 34.0, 35.0, 35.0, 36.0, 36.0]

撰写答案