Как выбрать билет без смещения из случайных байтов ICP
Равномерно случайный байт нельзя поровну разделить на шесть исходов. Перед вычислением номера билета канистра может отбросить лишний хвост диапазона.
Посчитайте входные значения
Метод raw_rand управляющей канистры асинхронно возвращает случайные байты. Для шести билетов значения от 0 до 251 образуют ровно 42 полных группы. Отбросьте значения 252–255 и возьмите следующий байт. При исчерпании буфера запросите новые байты, сохранив список билетов.
ticket_count = 6
accept a byte below 252
winner_index = accepted_byte % 6
Зафиксируйте участников до запроса случайности
До асинхронного запроса сохраните упорядоченный список и номер розыгрыша. Не допускайте повторного открытия розыгрыша после невыгодного результата. Отбрасывание хвоста устраняет численное смещение. Справедливость зависит также от правил допуска, порядка билетов и возможности перезапуска.