Если у вас нет какой-либо гарантии того, насколько вам может повезти (сколько раз вам придется вставлять задачу в ваш наименьший промежуток идентификатора сеанса), вы не можете добиться большего, чем каждый раз усреднять соседей. С достаточно большими числами и ограничением в 50 задач это совместимо с целыми числами.
Make fictional T endpoints with session IDs of 0 and 2^50 (# of tasks)
Each task gets the average of its neighbors' session ids.
T1 => S 2^49
T2 => S (0+2^49)/2 = 2^48 or (2^49+2^50)/2 = 2^49 + 2^48
etc...
Все пробелы в идентификаторах сеанса - это степени двойки, и мы начинаем с достаточно большого диапазона, чтобы мы могли уменьшить его вдвое в 50 раз если нужно.
2 ^ 49 = 562,949,953,421,312; idk, насколько это лучше, чем использование float