2010-12-22 3 views
0

Я выполняю n раздельных тестов на веб-сайте. Я хочу назначить равномерно распределенный целочисленный идентификатор пользователя одному из n ведер и детерминированно, чтобы один и тот же пользователь всегда получал один и тот же тест.Детерминистически присваивать идентификатор в списке взвешенных ведер

На данный момент я могу просто выбрать индекс в списке тестов split, изменив идентификатор пользователя на n. Что делать, если я хочу весить определенные тесты?

Например, ведро №1/21 назначается 90% времени, а оставшиеся 20 испытаний назначаются на 0,5% времени.

Я чувствую, что могу как-то увеличить размер моего списка и по-прежнему использовать технику мод для достижения этого, но наличие потенциально огромных временных списков в памяти кажется неэлегантным.

ответ

2

Если большинство ведер имеют различные размеры, где размер определяется как процент от ids, то вам придется как-то представить это в памяти. В противном случае, как еще вы узнаете эти проценты?

Одно из решений, которое нужно использовать, должно иметь 100 виртуальных ведер, каждый из которых представляет 1% идентификаторов. Затем свяжите 90 виртуальных ведер с ведром # 1/21. Затем вы можете выполнить mod 100, и если он попадает в виртуальные ведра в кулак 90, присвойте id ведро # 1. Вы можете получить оптимальное количество виртуальных ведер, разделив процент каждого ведра на GCD всех процентов, что в вашем примере равно 0,5 (GCD (90, 0,5)).

Из вашего примера, однако, существует только один отдельный размер ковша. Лучшее решение действительно зависит от того, какие типы аранжировок вы могли бы иметь.

+0

Чтобы уточнить, оптимальное количество виртуальных ведер - это СУМ каждого процента ведра, деленная на GCD. Я смог наименовать это в Python наивно со списком, который растет до оптимального числа. Мне интересно, можно ли это сделать с меньшим объемом памяти, например, только записями диапазонов номеров, где упадут ведра, что будет выглядеть как выбранный ответ здесь http://stackoverflow.com/questions/2140787/select-random- K-элементы из-а-списка-чей-элементы имеют-весы. Если бы вы могли публиковать псевдокод, это было бы здорово. В противном случае я отправлю свое решение в ближайшее время. – Bluu

+0

Кроме того, не могли бы вы уточнить, что вы имеете в виду под одним отдельным размером ведра? Какие еще существуют меры? – Bluu

+0

@Bluu Что касается различных размеров ковша, то ваш пример был 1x90% + 20x0.5%. 90% ковш - единственный, который отличается от остальных. – marcog

Смежные вопросы