Как реализовать экспоненциальный расчет задержки / задержки с фиксированным таймаутом и количеством попыток?
Большинство алгоритмов отката / задержки, которые я видел, имеют фиксированное количество попыток ИЛИ фиксированное время ожидания, но не оба.
Я хочу сделать ровно M попыток в течение T секунд с экспоненциальным интервалом между ними, так что "T = delay(0) + delay(1) + ... + delay(M-1)", где "delay(N) = (e^N - 1) / e" (где N - число повторов).
Как рассчитать значение "e" в приведенном выше описании, чтобы точно M попыток было предпринято в течение общего времени ожидания T (с заранее заданными M и T)?
1 ответ
Решение
Так как "T" является монотонной функцией "e", вы можете выполнить бинарный поиск, чтобы найти лучшее значение, которое подходит.
Вот пример программы на Python для поиска таких "e", как "T" и "M":
def total_time(e, M):
current = 1
total = 0
for i in range(M):
total += current-1
current *= e
return total
def find_best_e(T, M):
a, b = 0, T
while abs(a-b) > 1e-6:
m = (a+b)/2.0
if total_time(m, M) > T:
b = m
else:
a = m
return (a+b)/2
e = find_best_e(10, 3)
print([e**n-1 for n in range(3)])