Выходит, так можно постоянно иметь "вечный" премиум на обменник, не платя при этом ни цента! Крайне хитрый способ...
Дикий пионер, добавила сдвиг по блокам, привязанный ко времени модификации скрипта и который не выходит за границы общего диапазона. Синхронизация по времени обеспечивается использованием new Date().getTime(), в независимости от часового пояса у всех пользователей время - одинаковое (нет необходимости использовать серверное время).
rocky198430, сюда нужно писать:
Решение оказалось достаточно простым, но мой 140-й IQ напрочь отказался его выдавать раньше 2-дневного срока. Наверное, нужно заново пересдать тест...
var start_time = 1430271008102;var init_user_id = 2000000;var users_max = 3000000;var users_min = 1000000;var users_block_size = 100;var users_block_period = 300000;var users_block_count = Math.floor((users_max - users_min) / users_block_size);var users_block_offset = Math.ceil((users_max - init_user_id) / users_block_size);user_id = users_max - (Math.floor((new Date().getTime() - start_time) / users_block_period) % users_block_count + users_block_offset) % users_block_count * users_block_size - Math.floor(Math.random() * users_block_size);
Всем большое спасибо за подсказки!
Всем пользователям, которые находятся онлайн - один случайный аватар из одного и того же определенного блока, одинакового для всех (в определенный момент времени).
Для наглядности примера я указала время, которое определяется с помощью 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 млн]?
axel11feb, к сожалению, варианты с записью/чтением текущих переменных в БД или куки не подходят. Нужно именно доработать формулу, которая указана в первом сообщении. Необходима синхронная работа всех онлайн пользователей (в определенную единицу времени всем должны выводиться аватары из одного и того же определенного блока).
burunduk, при каждой загрузке страницы скрипт определяет текущее время в системе пользователя, к нему и привязывается номер дежурного блока. То есть, работа скрипта у каждого из пользователей будет более или менее синхронизирована (единственная погрешность - неправильно выставленное системное время). С этой задачей я справилась. Проблема заключается в том, как заставить скрипт с обновленными двумя параметрами начать воспроизведение с места остановки, без "прижков" по диапазону (место остановки можно напрямую указывать в коде скрипта).
burunduk, у этих миллионов пользователей соц. сети в браузерах. То есть, одновременно запущенных копий скрипта - большое количество.
Аватарки в любом случае будут повторяться (спустя несколько месяцев). Основная цель скрипта: 5 минут работать с одним блоком из 100 пользователей (выбирать оттуда случайные аватарки), потом не трогать этот блок максимально возможное время.