Детерминированное назначение идентификатора в списке взвешенных ведер
-
12-10-2019 - |
Вопрос
Я запускаю N -разделенные тесты на веб -сайте. Я хочу назначить равномерно распределенного целочисленного идентификатора пользователя одному из N Buckets, и определенно, чтобы один и тот же пользователь всегда получил один и тот же тест.
На этом этапе я могу просто выбрать индекс в списке разделенных тестов, модифицируя идентификатор пользователя по n. Что если я хочу взвесить определенные тесты?
Например, ведро № 1/11 назначается 90% случаев, а остальным 20 тестам присваивается 0,5% случаев.
Я чувствую, что могу каким -то образом увеличить размер моего списка и по -прежнему использовать технику MOD для достижения этого, но наличие потенциально огромных, временных списков в памяти кажется неотъемлемой частью.
Решение
Если большинство ведер имеют отдельные размеры, где размер определяется как процент идентификаторов, то вам придется каким -то образом представить это в памяти. В противном случае, как еще вы узнаете об этих процентах?
Одним из решений для использования является то, что, скажем, 100 виртуальных ведер, каждая из которых представляет 1% идентификаторов. Затем ассоциируйте 90 виртуальных ведер с ведром № 1/11. Затем вы можете выполнить мод 100, и если он попадает в виртуальные ведра кулака 90, назначьте идентификатор для ведра № 1. Вы можете получить оптимальное количество виртуальных ведер, разделяя процент каждого ведра на GCD из всех процентов, которые в вашем примере составляют 0,5 (GCD (90, 0,5)).
Из вашего примера есть только один отдельный размер ведра. Лучшее решение действительно зависит от того, какие типы договоренностей вы могли бы иметь.