- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Здравствуйте!
Помогите мне, пожалуйста, решить задание, над которым я уже бьюсь второй день без толку. Суть его следующая. Существует социальная сеть с 3 млн. пользователей. У каждого из них есть аватар. Я делаю скрипт, который будет отображать в специальной зоне один из этих аватаров, выбранный случайным образом. Правила для отбора аватара следующие:
1. Устанавливается верхняя и нижняя граница диапазона пользователей, среди которых нужно выбирать аватар (остальные нам не интересны). Например [от 3 млн ... до 1 млн]:
users_max = 3000000;
users_min = 1000000;
2. Получившийся диапазон в свою очередь разбивается на целое число блоков, которые будут поочередно участвовать в выборке. Например, размер каждого блока - 100 пользователей:
users_block_size = 100;
3. Каждые 5 минут блок по 100 пользователей сменяется следующим (по убыванию). И так по кругу внутри диапазона [от 3 млн ... до 1 млн]:
users_block_period = 300000; // указано в миллисекундах
Моё решение:
user_id = users_max - Math.floor(Date.now() / users_block_period) % Math.floor((users_max - users_min) / users_block_size) * users_block_size - Math.floor(Math.random() * users_block_size);
Другими словами, мы сначала определяем, сколько прошло 5-минуток с 1 января 1970 года с помощью функции Date.now(), далее получаем остаток от деления на количество блоков и определяем начало дежурного блока. Также работа скрипта жестко привязана к текущему времени. Если его запустить прямо сейчас (на момент написания этого предложения), случайные аватары начнут выбираться в блоке [2'258'300 ... 2'258'201].
--------------------
Далее нерешенный вопрос. В будущем параметры users_block_size и users_block_period будут изменяться, что в свою очередь повлечет за собой резкую смену расположения стартового блока. К примеру, скрипт работал несколько недель, спустился от 3'000'000 пользователей к 2'000'000, потом мы изменили параметры, и он резко перепрыгнул куда-то на 2'547'300 рубеж (еще раз на уже обработанных пользователей).
Хочу ввести еще 2 параметра:
start_time = 1430226525462; // текущее время запуска скрипта
resume_user_id = 2000000; // с этого пользователя мы возобновляем процесс
Но вот так и не придумала, как эти 2 параметра добавить в формулу (куда их "прикрутить"), поэтому прошу помощи. Всё, к чему сумела додуматься (неправильный вариант):
user_id = resume_user_id - Math.floor(Math.abs(Date.now() - start_time) / users_block_period) % Math.floor((users_max - users_min) / users_block_size) * users_block_size - Math.floor(Math.random() * users_block_size);
То есть, мне нужно всегда иметь возможность контролировать с какого пользователя возобновлять процесс работы скрипта. Буду благодарна за любые подсказки и советы!
С уважением,
Slavegirl
Похоже не на задачку на IQ, а на тестовое задание в какую-нибудь из соцсетей.
Требований не вижу, задача в том, чтобы не повторялись аватарки? Иначе в чем проблема, что период и размер блока могут меняться?
Я бы вот сделал два отдельных скрипта - первый запускается раз в период и меняет по размеру блока номер, с которого начинается следующий блок - т.е. грубо говоря вычитает из текущего значения размер блока. Второй скрипт (может быть даже часть одного скрипта) - уже выбирает нужное количество пользователя.
При изменении периода и размера блока - у вас просто поменяется время запуска скрипта. Выбирать пользователей скрипт будет с прошлого номера и дальше.
Требований не вижу, задача в том, чтобы не повторялись аватарки? Иначе в чем проблема, что период и размер блока могут меняться?
Аватарки в любом случае будут повторяться (спустя несколько месяцев). Основная цель скрипта: 5 минут работать с одним блоком из 100 пользователей (выбирать оттуда случайные аватарки), потом не трогать этот блок максимально возможное время.
slavegirl, всего один вопрос, JavaScript где исполняется? :)
burunduk, у этих миллионов пользователей соц. сети в браузерах. То есть, одновременно запущенных копий скрипта - большое количество.
в браузерах
соответственно, при каждой загрузке страницы скрипт будет выполнятся с самого начала или вы каждому пользователю присвоите какую-то переменную, которую будите хранить в базе и дёргать её от туда? :)
burunduk, при каждой загрузке страницы скрипт определяет текущее время в системе пользователя, к нему и привязывается номер дежурного блока. То есть, работа скрипта у каждого из пользователей будет более или менее синхронизирована (единственная погрешность - неправильно выставленное системное время). С этой задачей я справилась. Проблема заключается в том, как заставить скрипт с обновленными двумя параметрами начать воспроизведение с места остановки, без "прижков" по диапазону (место остановки можно напрямую указывать в коде скрипта).
Можно так: когда пользователь первый раз заходит на страницу, ему выставляется cookie с просмотренным блоком ( допустим 2850). В следующий раз ему выводится блок 2851 и в cookie записывается номер этого блока. Минус этого решения в том, что блоки выводятся не рандомно (не считая первого раза)
axel11feb, к сожалению, варианты с записью/чтением текущих переменных в БД или куки не подходят. Нужно именно доработать формулу, которая указана в первом сообщении. Необходима синхронная работа всех онлайн пользователей (в определенную единицу времени всем должны выводиться аватары из одного и того же определенного блока).
axel11feb,(в определенную единицу времени всем должны выводиться аватары из одного и того же определенного блока).
Всем разные или всем одинаковые?
axel11feb, к сожалению, варианты с записью/чтением текущих переменных в БД или куки не подходят.
И как без фиксации записи на сервере или куках продолжать всем показ когда пользователь ушел, пришел, тем более если у многих время может быть разное?
как их синхронизировать без серверной части, только на JS?
Всем разные или всем одинаковые?
Всем пользователям, которые находятся онлайн - один случайный аватар из одного и того же определенного блока, одинакового для всех (в определенный момент времени).
И как без фиксации записи на сервере или куках продолжать всем показ когда пользователь ушел, пришел, тем более если у многих время может быть разное?
как их синхронизировать без серверной части, только на JS?
Для наглядности примера я указала время, которое определяется с помощью JavaScript. В действительности текущее время будет определяться сервером, для 100% синхронизации.
Еще раз приведу код программы:
start_time = 1430226525462; // текущее время запуска скрипта (определяется вручную перед самим запуском)
resume_user_id = 2000000; // с этого пользователя мы возобновляем процесс
users_max = 3000000;
users_min = 1000000;
users_block_size = 100;
users_block_period = 300000; // указано в миллисекундах
user_id = users_max - Math.floor(Date.now() / users_block_period) % Math.floor((users_max - users_min) / users_block_size) * users_block_size - Math.floor(Math.random() * users_block_size);
Вопрос: как привязать к формуле параметры start_time и resume_user_id, чтобы после запуска скрипта отсчет начинался с 2-миллионного пользователя (вниз) и далее по кругу в пределах диапазона [от 3 млн ... до 1 млн]?