RandomBench Посібник

Як провести чесний онлайн-розіграш, який може перевірити кожен

RandomBench визначає переможців розіграшу, підкидає монетку, кидає кубики, вибирає числа, ділить людей на команди й крутить колесо. Усе дає криптографічна випадковість вашого пристрою, а розіграш будь-хто може повторити за посиланням, тож нікому не треба вірити організатору на слово.

Команда fof.lol · Оновлено · 9 хв читання

Відкрити RandomBench

Що вміє RandomBench

Сім інструментів, кожен на окремій сторінці, тож потрібний можна додати в закладки:

  • Монетка: об’ємне підкидання, лік орлів і решок за сесію, поточна серія й серії до 100 000 кидків за раз.
  • Кубики: 1–20 кубиків d4, d6, d8, d10, d12, d20 чи d100 або будь-який кидок у нотації настільних ігор — із сумою й кожним кубиком окремо.
  • Числа: будь-який діапазон, від’ємний чи величезний, з повторами чи без, із сортуванням чи без, цілі чи зі знаками після коми, а ще лотерейні шаблони.
  • Розіграш: переможці й запасні зі списку до 100 000 учасників, у кілька раундів, з барабаном, що оголошує кожного переможця, і результатом, який може перевірити кожен.
  • Команди: перемішати список або поділити його на задану кількість команд чи команди заданого розміру — якомога рівніше.
  • Колесо: ваші варіанти з кольорами й вагами та обертання, що сповільнюється, як справжнє колесо.
  • Так/ні, карти й інше: так чи ні, камінь-ножиці-папір, карта з колоди на 52 чи 54 карти, випадкова літера, колір у HEX і RGB, дата між двома датами.

Натисніть пробіл або Enter будь-де поза текстовим полем, щоб повторити. Кнопка з динаміком вмикає короткі звуки (типово вимкнені), телефони коротко вібрують із кожним результатом, а кнопка повного екрана лишає на екрані тільки результат і головну кнопку — достатньо великі для проєктора чи стріму. Якщо в системі ввімкнено «зменшення руху», результати з’являються одразу, без анімації.

Як провести розіграш

  1. Додайте учасників, по одному в рядку: введіть їх, натисніть Вставити або відкрийте файл .txt чи експорт .csv (береться перший стовпець, наприклад імена чи нікнейми). Зайві пробіли прибираються, порожні рядки пропускаються, а з увімкненим Прибрати дублікати повторене ім’я рахується один раз, хоч би якими були великі літери. Лічильник показує, скільки учасників лишилося. Списки на 10 000 чи 100 000 рядків — не проблема.
  2. Задайте кількість переможців і запасних та, за бажанням, назву. Запасні визначаються після переможців, по черзі, — на випадок, якщо переможець не відповість.
  3. Зафіксуйте список і опублікуйте відбиток (у блоці Чесний розіграш). RandomBench покаже відбиток SHA-256 із 64 знаків і готове оголошення. Опублікуйте його там, де його побачать учасники, до розіграшу: у дописі про розіграш, закріпленому коментарі чи чаті стріму.
  4. Проведіть розіграш. Барабан прокручує імена й зупиняється на кожному переможці по черзі; Пропустити анімацію чи пробіл показують усіх одразу. Наступний раунд, без переможців визначає ще переможців серед тих, хто ще не виграв.
  5. Поділіться посиланням під результатом. Воно містить список, зерно й публічне значення, тож будь-хто повторить розіграш на власному пристрої.

Можна й одразу натиснути Визначити переможців: список зафіксується, а відбиток створиться в ту саму мить. Результат так само відтворюється за посиланням, але лише відбиток, оприлюднений заздалегідь, доводить, що потім нічого не змінювали.

Зафіксований розіграш зберігається в цьому браузері, тож закрита вкладка не загубить уже опублікований відбиток. Зберегти зерно (JSON) дає змогу завершити розіграш на іншому пристрої: відкрийте файл через Імпорт JSON і натисніть Продовжити цей розіграш тут. Нікому не показуйте цей файл, доки розіграш не завершиться.

Чому організатор не може підлаштувати результат

Результат розіграшу в RandomBench не випадковий у мить натискання кнопки: його обчислено з трьох складників, і будь-який пристрій, що їх знає, отримає точно тих самих переможців.

  • Список — у його порядку.
  • Таємне зерно — 32 шістнадцяткові знаки (128 біт) від криптографічного генератора пристрою або ваш власний текст.
  • Публічне значення, якщо ви його вибрали: те, чого ще ніхто не знає, коли публікується відбиток, — наприклад, виграшні числа тиражу лотереї наступної суботи чи значення біржового індексу на закритті. Його опис входить у відбиток, а саме значення вводиться під час розіграшу.

Відбиток — це SHA-256 від назви, зерна, опису публічного значення й усього списку. SHA-256 працює в один бік: з відбитка неможливо відновити зерно, і неможливо підібрати інший список чи зерно з тим самим відбитком. Тож:

  • Учасники не можуть передбачити переможців до розіграшу: вони не знають зерна.
  • Організатор не може після публікації додати друга, когось прибрати, змінити порядок чи замінити зерно: відбиток перестане збігатися.
  • З публічним значенням організатор не може навіть заздалегідь перебирати зерна, доки не випаде зручне, бо результат залежить і від значення, якого ще не існує. Без нього опублікований відбиток так само фіксує список, але теоретично організатор міг перепробувати багато зерен до публікації. Для чогось важливого додавайте публічне значення.

Сам розіграш: відбиток і публічне значення ще раз хешуються SHA-256 у ключ для ChaCha20 — добре вивченого потокового шифру (RFC 8439), який і дає випадкові числа. Переможці — це перші кроки перемішування Фішера–Єйтса над списком, без зміщення. Кожен раунд має власний ключ і виключає попередніх переможців.

Як перевірити розіграш

  1. До розіграшу збережіть відбиток, який опублікував організатор (достатньо знімка екрана з дописом).
  2. Після розіграшу відкрийте посилання від організатора. RandomBench перерахує все на вашому пристрої; переможців у посиланні взагалі немає.
  3. Вставте збережений відбиток у поле Відбиток, оприлюднений до розіграшу. Зелене «Збігається» означає, що список і зерно саме ті, що були оголошені; червоне «Не збігається» — що щось змінили.
  4. Якщо є публічне значення, перевірте, що це справді, скажімо, опублікований результат лотереї за ту дату.
  5. Розгорніть Усі учасники й переконайтеся, що ваше ім’я є в списку.

Довіряти RandomBench теж не обов’язково. Відбиток — це звичайний SHA-256 від тексту, описаного в коментарях коду rng.js, тож його можна перерахувати будь-яким інструментом SHA-256, а прихований самотест #/selftest звіряє SHA-256 і ChaCha20 з їхніми опублікованими тестовими векторами.

Монетка, кубики й нотація

Результат монетки визначається ще до того, як вона почне обертатися; об’ємна анімація його лише показує. Для серії видно кількість орлів і решок, найдовшу серію поспіль і те, наскільки незвичний поділ: чесна монетка відхиляється від 50% більш ніж на два стандартні відхилення приблизно в одній серії з 20.

Кубики розуміють нотацію настільних рольових ігор. Кубик, кількість і модифікатор можна вибрати й кнопками.

НотаціяЩо означає
d20один двадцятигранний кубик
2d6+3два шестигранні кубики плюс 3
4d6dl1чотири d6, відкинути найменший (характеристики персонажа)
2d20kh1 / 2d20kl1перевага / перешкода: лишити найбільший / найменший
d%, d100число від 1 до 100
1d8+2d6-1кілька груп і модифікатор

k означає kh, а сама d після кубика — dl; українська к працює так само, як d. За один кидок — до 100 кубиків по 2–1000 граней. Відкинуті кубики показано закресленими.

Числа, команди й колесо

  • Числа: діапазон може бути від’ємним і завдовжки до 45 цифр. Зі знаками після коми кожне значення цієї сітки однаково ймовірне (від 0 до 1 з 2 знаками — це 0.00, 0.01 … 1.00). Без повторів працює на будь-якому діапазоні; якщо попросити більше різних значень, ніж є в діапазоні, буде повідомлення, а не зависання. До 10 000 чисел за раз. Лотерейні шаблони: 6/49, 6/45, 5/36, 5/50 + 2/12 і 5/69 + 1/26.
  • Команди: список перемішується й роздається, як карти, тож розмір команд відрізняється щонайбільше на одного. «Осіб у команді» створює стільки команд, скільки треба: 10 людей по 3 — це чотири команди по 3, 3, 2 і 2.
  • Колесо: вага 2 робить варіант удвічі ймовірнішим за варіант з вагою 1, а його сектор — удвічі ширшим. Спершу визначаються переможець і точне місце зупинки в його секторі; потім колесо робить 5–7 обертів і сповільнюється саме туди. Увімкніть Прибирати варіант, що випав, щоб вибирати варіанти по одному.

Як влаштована випадковість

Усе на сторінці проходить через один невеликий модуль. Він бере випадкові числа лише з crypto.getRandomValues — криптографічного генератора браузера, — і ніколи з Math.random.

Поширений спосіб отримати «число від 1 до n» — взяти випадкове 32-бітне число й лишити остачу від ділення на n. Якщо n не ділить 232 націло, малі результати тоді випадають трохи частіше. RandomBench відкидає числа з неповної верхньої частини діапазону й бере нові (rejection sampling), тож кожен результат однаково ймовірний — і для 3, і для 1 000 001, і для діапазону з 30 цифр. Списки перемішуються алгоритмом Фішера–Єйтса на тому самому генераторі.

Прихований самотест #/selftest перевіряє це на вашому пристрої за пару секунд: мільйон монеток і мільйон d6 тестом χ², «незручні» діапазони 1–3, 1–1 000 001 і 1–3 000 000 000, перемішування, діапазон 1030 і відтворюваність розіграшу. Поруч із тестом на 3 000 000 000 видно χ² наївного способу з остачею на тих самих даних — десятки тисяч, явний провал.

Приватність

  • Нічого з того, що ви вводите, нікуди не надсилається: окрім анонімної статистики відвідувань усього сайту (без cookies і без частини адреси після #), сторінка не робить запитів і після встановлення працює офлайн.
  • Списки, налаштування й незавершений розіграш зберігаються в цьому браузері. Результати потрапляють в історію лише тоді, коли ви їх зберігаєте, — крім розіграшів: вони зберігаються автоматично, щоб жоден не загубився.
  • Посилання містить те, що потрібно, щоб показати чи повторити результат: для розіграшу — весь список учасників. Поширюйте його, лише якщо учасники погодилися бути в списку; краще нікнейми, ніж повні імена й контакти.
  • Розіграшем не можна поділитися до того, як його проведено: до того посилання розкрило б зерно.

Обмеження

  • Посилання на великий список довге. 10 000 імен — це посилання на кілька десятків кілобайтів, і месенджери можуть його обрізати. Надішліть натомість файл JSON або опублікуйте список деінде разом із відбитком.
  • Поширені результати монетки, кубиків і чисел — це записи, а не докази: будь-хто міг кидати багато разів і поділитися тим результатом, що сподобався. Перевірити можна лише розіграш із відбитком, опублікованим заздалегідь.
  • Розіграш без публічного значення фіксує список і зерно, але не доводить, що організатор не перепробував кілька зерен до публікації.
  • До 100 000 учасників по 200 знаків, 100 кубиків за кидок, 10 000 чисел і 5000 імен для команд.

Часті запитання

Комп’ютерна монетка справді 50 на 50?

Так. Кожен кидок бере рівноймовірний випадковий біт із криптографічного генератора, а самотест перевіряє мільйон кидків. Справжня монетка, якщо вже на те пішло, трохи менш чесна.

Як довести підписникам, що розіграш був чесним?

Зафіксуйте список, опублікуйте відбиток до розіграшу (найкраще з публічним значенням, наприклад числами лотереї наступного тижня), а потім поділіться посиланням на результат. Будь-хто перерахує переможців і порівняє відбиток.

Чому той самий список і зерно завжди дають тих самих переможців?

У цьому й суть: розіграш — це обчислення, тож його можна перевірити. Непередбачуваність дають таємне зерно й публічне значення, яких ніхто не знає наперед.

Що робити, якщо переможець не відповідає?

Визначте разом із переможцями кількох запасних — вони беруться по черзі. Або проведіть ще один раунд, який виключає всіх, хто вже виграв.

Чи працює без інтернету?

Так. Після першого відвідування сторінка зберігається в кеші, а з меню браузера її можна встановити як застосунок.

Спробуйте RandomBench зараз

Підкиньте монетку, киньте кубики чи проведіть розіграш, який ніхто не назве підлаштованим.

Відкрити RandomBench

Схожі інструменти