Як чесно обрати переможців розіграшу і показати, як це відбувалося
Щоб чесно обрати переможця, використовуйте генератор, створений для безпеки, дайте кожному учаснику однакові шанси й дозвольте людям перевірити результат пізніше. Більшість несправедливості у простому випадковому виборі походить з одного з двох місць: слабкого джерела випадковості або невеликої арифметичної помилки, яку називають зміщенням за модулем. Обидві проблеми можна виправити. Опублікований список учасників і запис жеребкування найкраще доводять, що переможця ніхто не обирав заздалегідь.
Випадковий вибірЧесно вибрати переможцяБезкоштовноСправжня й псевдовипадковість
Справжнє випадкове джерело бере непередбачуваність із фізичного процесу, наприклад з електронного шуму. Псевдовипадковий генератор є формулою. Він починається з початкового значення (seed), виконує детерміновані кроки й видає послідовність, яка лише схожа на випадкову. Ця послідовність повністю визначається початковим значенням, тож той, хто знає його й формулу, може передбачити кожне число.
Більшість програмного забезпечення використовує псевдовипадкові генератори, і це цілком нормально для перемішування плейлиста чи рандомізації рівня в грі. Але для розіграшу призу важливо, чи може хтось передбачити результат або вплинути на нього. Генератор, який швидкий, але передбачуваний, для цього не підходить.
Використовуйте криптографічний генератор браузера
У JavaScript Math.random() є швидким псевдовипадковим генератором. Його документація каже, що він не придатний для криптографії, а жеребкування призу є рішенням, пов’язаним із безпекою. Функція Web Crypto crypto.getRandomValues() заповнює масив значеннями з криптографічного джерела випадковості операційної системи. Саме її й слід використовувати. Випадковий вибір застосовує її для кожного вибору, зокрема для підкидання монети та кубика. Інструмент, який не пояснює, що саме він використовує, важче довіряти, тож поцікавтеся, перш ніж на нього покладатися.
Зміщення за модулем на одному прикладі
Припустімо, ваше джерело видає випадковий байт, тобто ціле число від 0 до 255, а вам потрібен один із трьох учасників. Найпростіший шлях — взяти остачу від ділення на 3. Це виглядає справедливо, але 256 не ділиться на групи по три без залишку.
- Значення 0, 3, 6 і далі аж до 255 дають остачу 0. Таких значень 86.
- Значень із остачею 1 є 85, і значень із остачею 2 також 85.
Тож учасник 0 випадає 86 разів із 256, тобто приблизно у 33,6 % випадків, а учасники 1 і 2 випадають по 85 разів, приблизно у 33,2 %. Різниця невелика, але вона реальна, і вона зростає, коли кількість учасників стає великою порівняно з діапазоном джерела.
Виправлення — відбір із відхиленням (rejection sampling). Витягніть значення, і якщо воно потрапляє в нерівномірну «залишкову» частину, витягніть знову. У прикладі з байтом ви відхиляєте 255 і приймаєте лише значення від 0 до 254, які без залишку діляться на трійки. Для 32-бітного випадкового числа залишок становить приблизно одне значення на 4,3 мільярда, тож зміщення для розіграшу є незначним. Але дбайливий вибір усе одно враховує його, бо ця помилка стає відчутнішою, коли діапазон звужується.
Жеребкування без повторів
Якщо потрібно кілька переможців, вибір випадкового індексу тричі може двічі обрати той самий запис. Два чисті методи цього уникають:
- Видаляйте кожного переможця зі списку, а потім тягніть знову з решти.
- Один раз перемішайте весь список методом Фішера–Єйтса, а потім беріть переможців зверху.
Фішер–Єйтс проходить список з кінця, міняє кожну позицію місцями з випадково вибраною позицією на цій або попередній, і за справедливого випадкового вибору дає кожен порядок з однаковою ймовірністю. Метод короткий, добре вивчений і легко пояснюється учасникам. Опції «Видаляти переможців» і «Без повторів» у випадковому виборі реалізують обидва методи.
Зробіть жеребкування перевірним
Чесний розіграш — це той, який кожен може перевірити. До жеребкування:
- Опублікуйте учасників у вигляді нумерованого списку разом із правилами, хто має право брати участь.
- Опублікуйте відбиток SHA-256 цього списку. Його можна створити будь-яким інструментом SHA-256, наприклад генератором хешів. Відбиток повністю змінюється, якщо змінюється хоча б один запис, тож список не можна потай відредагувати пізніше. Та сама перевірка підтверджує завантаження; як це зробити, описано в статті як перевірити контрольну суму SHA-256 завантаженого файлу.
Під час і після жеребкування:
- Запишіть екран від моменту запуску випадкового вибору до показу результату.
- Опублікуйте фінальний список із номером переможця, щоб люди могли перерахувати відбиток і переконатися, що нічого не змінилося.
- Напишіть, як обрали переможця, наприклад: «обрано за допомогою інструменту в браузері, який використовує криптографічне джерело випадковості операційної системи».
Правила розіграшів відрізняються на різних платформах, а призові розіграші можуть мати юридичні вимоги, що залежать від вашого місця проживання. Перевірте правила акцій платформи та місцеве законодавство, перш ніж проводити розіграш. Це загальні рекомендації, а не юридична консультація. Коли будете готові, оберіть переможця за допомогою випадкового вибору.
Як зробити це у fixmint
- Виберіть Імена, а потім вставте учасників у поле Імена, по одному в рядку.
- Установіть Переможці на кількість призів. Позначте Видаляти переможців зі списку, щоб ніхто не виграв двічі.
- Для нумерованого жеребкування виберіть Число, задайте Найменше і Найбільше, а також позначте Без повторів, якщо кожен номер може виграти лише раз.
- Натисніть Обрати переможців, попередньо запустивши запис екрана з самого початку.
- Опублікуйте нумерований список учасників, відбиток SHA-256, переможця і опис того, як використовувався інструмент.
Короткі відповіді
Чи підходить Math.random() для розіграшу?
Він підходить для ігор і перемішування, але не для жеребкування, яке люди перевірятимуть, бо його результат можна передбачити. Використовуйте криптографічне джерело.
Чому б не взяти випадкове число за модулем від кількості учасників?
Коли діапазон не ділиться без залишку, остачі розподіляються нерівномірно, і деякі учасники мають трохи більші шанси. Відбір із відхиленням усуває це зміщення.
Чи можна обрати кількох переможців в одному жеребкуванні?
Так. Видаляйте кожного переможця перед наступним вибором або один раз перемішайте список і візьміть верхні записи. В обох випадках жоден учасник не може виграти двічі.
Переклад з Англійський оригінал за допомогою ШІ.
Коментарі
Коментарів поки немає. Будьте першим.


