Что делать, если вы хотите разыграть лотерею, но хотите исключить "фактор веры" в устроителя лотереи и всякую возможность для манипуляции результатами лотереи?
Это возможно сделать математическими методами, для чего перед началом регистрации участников (продажей билетов) следует получить и опубликовать случайную строку символов произвольной длины, которая будет служить случайным начальным вектором при раздаче призов. Если участникам разрешить в определенной мере самим выбирать номера билетов, например, используя свои уже существующие до начала розыгрыша имена, то публикация этого вектора практически полностью исключает возможность манипуляции результатами розыгрыша любыми сторонами при соблюдении некоторых условий.
Для раздачи призов мы берем
криптографический хеш от строки, состоящей из опубликованного случайного вектора и "билета" участника (имени пользователя). Особенностью таких функций является то, что практически невозможно из хеша получить обратно исходное значение. Также эти функции обладают
лавинным эффектом, что означает что смена даже одного бита в векторе или в "номере" билета ведет к существенной смене итогового хеша и изменению результата лотереи для конкретного участника.
Полученный список билетов (имен пользователей) с хешами мы сортируем и получаем список победителей, который, с одной стороны, один единственный для заданного вектора и, с другой стороны, неизвестен, пока не определен список участников.
Конечно, сам факт публикации случайного вектора не гарантирует того, что он не был специально подобран под известного победителя, потому в расчет итогового списка стоит внести зависимость от исходного списка участников. Таким образом смена списка участников изменит и победителя. Включая список участников в функцию расчета победителя мы даем некоторую власть вам над результатами розыгрыша, откуда естественно следует требование прозрачности отбора участников: у каждого должна быть возможность проверить наличие воли того или иного участника к участию, например, при помощи перепоста.
Предлагаю вам маленькую программу на чистом JavaScript,
которая делает ровно то, что описано выше.
Программа идет
с исходным кодом, а значит каждый может ознакомиться с ним и убедиться что программа делает именно то, что она делает и ничего больше.
Выражаю благодарность
eugenyshultz за наводку на этот метод розыгрыша.