Вот мое решение, если мы допустим, чтобы интервалы были немного неравными.
Предположим, что наши вызовы A[0]
, A[1]
, ..., A[n]
с частотами f[0]
,f[1]
, ..., f[n]
, где все частоты находятся в одной единице.Например, 60 / час, 120 / час и т. Д.
Общая частота, с которой происходят события, будет f = f[0] + f[1] + ... + f[n]
, что означает, что некоторые события будут планироваться каждые hour/f
с интервалом времени.Вопрос в том, что произойдет, когда.
Способ представить это - представить, что у нас есть ряд ведер, наполненных водой.Каждый раз, когда мы будем сбрасывать единицу воды из самого полного ведра перед нами.
Поскольку в самом начале нам все равно, с чего начать, давайте инициализируем вектор чисел, просто назначая случайные числаих, full[0]
, full[1]
, ..., full[n]
.И теперь наш алгоритм выглядит так: псевдокод:
Every hour/f time apart:
for each i in 0..n:
fill[i] += f[i]/f
i_choice = (select i from 0..n with the largest f[i])
fill[i_choice] -= 1
Do event A[i_choice]
Это приводит к событиям, разнесенным как можно дальше друг от друга, но с повторяющимися событиями, происходящими в слегка неравномерном ритме.В вашем примере это приведет к тому, что каждые 20 секунд будут происходить события, следующие шаблону ...ABBABBABBABB...
.