Всем привет!
Подскажите пожалуйста, вдруг кто знает алгоритм выбора победителя, соответствующий следующим пунктам:
1. Пользователи "донатят" рубли. 1 рубль - 1 билет. Первый пользователь закинул 5.000р, второй 50р. Соответственно всего билетов будет 5050. И выбирается выигрышный - 1-5000 - вин юзер 1, 5001-5050 - вин юзер два. То есть это не рулетка, где 3 цвета, должно учитываться сколько пользователи поставили
2. Перед игрой должен генерироваться какой-то ключ, чтобы после игры пользователи смогли проверить, честная ли игра была по каким то алгоритмам.
3. Нельзя предугадать / расшифровать ключ исход
Пока, что получилось понять, это что у юзера1 шансы 5000/5050, а у юзера2 - 50/5050
Почему тогда просто не брать рандомно число в диапазоне от 1 до 5050?
1. Процентное соотношение от общей суммы.
2. Входные и выходные данные должны быть доступны всем участникам m1=md5(num1.SECSALT), m2=md5(num2.SECSALT), m3=md5(num3.SECSALT) и т.д.
Затем формируем HASH: HASH=md5(m1.m2.m3.SECSALT) после голосования раскрываем num1, num2, num3 и SECSALT всем участникам голосования и формулы для проверки.
3. Однонаправленные функции хеширования.
Проблема в том, что, имея алгоритм, владелец может подтасовать победу, вводя выдуманных участников с нужными долями. Не будет же он у каждого требовать паспортных данных и публиковать эту информацию.
Adamos, если сделать по цепочке и хотя бы кто-то не раскроет свой ключ, то все другие не смогут проверить корректность. такой вариант - тоже не подходит.
Значит нужен незаинтересованный сервис для хранения промежуточных ключей от каждого из пользователей.
xmoonlight, сервис сервисом, а что помешает директору цирка перед самым финалом вбросить от имени Васи Пупкина решающие полтора голоса, которые сменят победителя в этом алгоритме на более нужного?
Adamos, сервис помешает. Т.к. алгоритм работы сервис раскрывает только после определения победителя этим сервисом. И уже ни устроитель, ни участники никак не смогут повлиять на результат и как-то подогнать.
xmoonlight, бритва Оккама быстро сводит воедино держателя сервиса и устроителя.
Но даже если они реально независимы - как устроитель, в свою очередь, может верить сервису, у которого в руках все козыри? Приходим туда же.
Adamos, А зачем он будет верить? Сервис лишь предоставляет информацию всем участникам и устроителю. Но ничего не держит в плане финансов (премий и т.д.). Т.е. сервис - это не гарант! Ему не важно кто и что там кому после этого будет должен. Он лишь рандомит и всё.
xmoonlight, с т.з. участника всего этого цирка - тот сервис должен иметь немалую репутацию действительно независимой третьей стороны. Иначе вполне закономерно предположить сговор между ним и устроителем, а то и прямую связь, закамуфлированную от участников таким образом.
xmoonlight, разве что организационно.
Например, после того, как все ставки сделаны, предоставить участнику, выкупившему максимальную долю, выбрать случайное число с тем, чтобы оно тоже участвовало в расчете.
xmoonlight, именно в предположении, что человек, сделавший максимальную ставку, на виду.
Если это постоянно будет кто-то левый - репутация разыгрывающего скроется под плинтусом.
xmoonlight, еще раз: именно это и создает обратную связь. Устроителю невыгодно внедрять подсадку, потому что все будут думать, что это подсадка, и никто не будет участвовать. В среде, где люди не совсем незнакомы (например, в онлайн-игрушке или соцсети) - такая схема вполне может сработать.
А в среде полных анонимов делать ставки - ну, это же несерьезно, какие бы там ни были математические сервисы...
Adamos, можно ещё так:
1. Чтобы каждый дал коэффициенты для общей формулы расчёта (полином) и своё число. Всё в зашифрованном виде (алгоритм шифрования - произвольный, но известный лишь на 2-м этапе). Эти записи видны всем, но закриптованные.
2. На 2-м этапе приём участников прекращается и все существующие дают ключи и алгоритмы для расшифровки. Данные всех участников - расшифровываются этими ключами и алгоритмами.
3. Затем все коэффициенты усредняются и подставляется это число как множитель одного из коэффициентов (в порядке очереди подачи заявок на участие).
4. Результат вычисления полинома - можно взять по-модулю и округлить.
5. Ну а дальше - взять остаток от деления на кол-во участников, к примеру или что-то ещё...
Главное - что это будет всеми проверяемо и не подтасовать уже.
xmoonlight, ну да, это все усложняет возможность подтасовки.
Однако сложность алгоритма уже такова, что человек, способный его понять... скажем, достаточно умен, чтобы не играть в азартные игры ;)