
Что делать, если вы хотите разыграть лотерею, но хотите исключить "фактор веры" в устроителя лотереи и всякую возможность для манипуляции результатами лотереи?
Это возможно сделать математическими методами, для чего перед началом регистрации участников (продажей билетов) следует получить и опубликовать случайную строку символов произвольной длины, которая будет служить случайным начальным вектором при раздаче призов. Если участникам разрешить в определенной мере самим выбирать номера билетов, например, используя свои уже существующие до начала розыгрыша имена, то публикация этого вектора практически полностью исключает возможность манипуляции результатами розыгрыша любыми сторонами при соблюдении некоторых условий.
Для раздачи призов мы берем криптографический хеш от строки, состоящей из опубликованного случайного вектора и "билета" участника (имени пользователя). Особенностью таких функций является то, что практически невозможно из хеша получить обратно исходное значение. Также эти функции обладают лавинным эффектом, что означает что смена даже одного бита в векторе или в "номере" билета ведет к существенной смене итогового хеша и изменению результата лотереи для конкретного участника.
Полученный список билетов (имен пользователей) с хешами мы сортируем и получаем список победителей, который, с одной стороны, один единственный для заданного вектора и, с другой стороны, неизвестен, пока не определен список участников.
Конечно, сам факт публикации случайного вектора не гарантирует того, что он не был специально подобран под известного победителя, потому в расчет итогового списка стоит внести зависимость от исходного списка участников. Таким образом смена списка участников изменит и победителя. Включая список участников в функцию расчета победителя мы даем некоторую власть вам над результатами розыгрыша, откуда естественно следует требование прозрачности отбора участников: у каждого должна быть возможность проверить наличие воли того или иного участника к участию, например, при помощи перепоста.
Предлагаю вам маленькую программу на чистом JavaScript, которая делает ровно то, что описано выше.
Программа идет с исходным кодом, а значит каждый может ознакомиться с ним и убедиться что программа делает именно то, что она делает и ничего больше.
Выражаю благодарность
2012-12-31 10:37 am (UTC)
Берем список реальных участников, добавляем к нему несуществующего игрока смотрим выиграл ли наш протеже, если нет меняем подставному фамилию, повторяем. Статистически будет достаточно придумать столько фамилий сколько участников.
2012-12-31 10:55 am (UTC)
В сто раз проще обмануть без всякого подбора имен если использовать традиционный метод барабана с номерками.
Edited at 2012-12-31 11:05 am (UTC)
2012-12-31 11:13 am (UTC)
Список участников -
drugoi
sergeydolya
tema
zyalt
navalny
shpilenok
mi3ch
prostitutka_ket
pesen_net
miumau
cdesz
mzadornov
Смотрим Ваш скрипт и поздравляем меня с победой
2012-12-31 11:14 am (UTC)
Попробуйте с таким, например, подобрать:
GlJwBGX7l37FftvqBkG8ctnFROl7cpzbWXaoVmG0
Edited at 2012-12-31 11:16 am (UTC)
2012-12-31 11:28 am (UTC)
В этот раз вместо задорного пригласим какого-то
2012-12-31 01:27 pm (UTC)
Edited at 2012-12-31 01:54 pm (UTC)
2012-12-31 11:38 am (UTC)
sergeydolya
tema
zyalt
navalny
shpilenok
mi3ch
prostitutka_ket
pesen_net
miumau
zverolov
piony
Пожалуйста, с вашим вектором и с помощью юзера piony (только что из моей фленты). Я победил!
2012-12-31 01:28 pm (UTC)
Если вы собираетесь скрывать список участников, то эти криптографические ухищрения вам не нужны. Вы и без них можете замечательно поставить нужного человека на нужное место.
Edited at 2012-12-31 01:55 pm (UTC)
2012-12-31 02:00 pm (UTC)
2012-12-31 02:11 pm (UTC)
Как уже говорил, организаторы могут дать выиграть своем и без всех этих плясок с хеш-функциями. Барабан с номерками и никто носа не подточит, ибо дареному коню, как известно... :-)
2012-12-31 02:19 pm (UTC)
Почему бы вам тогда не зарегистрировать пару сотен юзернеймов, чтобы успеть к началу следующего розыгрыша? ))) Многие боты, кстати, действительно регистрируются сильно загодя начала своей активности.
>Как уже говорил, организаторы могут дать выиграть своем и без всех этих плясок с хеш-функциями.
О чём и речь! Я бы больше доверял барабану.
2012-12-31 01:58 pm (UTC)
А если один из участников удалит свой перепост - окажется что он лишний в списке.
Без доверия всё равно не обойтись :)
2012-12-31 01:59 pm (UTC)
2012-12-31 02:36 pm (UTC)
2013-01-01 01:36 am (UTC)
2013-01-01 02:12 pm (UTC)
За минуту до конца регистрации берем список, подбираем ник обеспечивающий победу, регистрируем его, делаем перепост, профит.
Вообщем математическое решение есть но оно вряд ли интересно, т.к. участники лотереи не всегда будут готовы делать дополнительные действия между заявкой на участие и розыгрышем. Но есть вполне качественная замена - источник энтропии неподконтрольный организатору. Нужно что-то публичное, проверяемое, непредсказуемое во время сбора ставок но известное к розыгрышу. Например хеш от первых 20 существительных в выпуске новостей в день розыгрыша, или хеш всех телефонов на 18 странице газеты бесплатных объявлений или количество букв а в топ3 постах ЖЖ на момент розыгрыша.