Spinvolta

Как устроена честность

Сначала случай. Потом анимация. Проверяемо, когда это важно.

1. Каждый результат — из криптографического генератора

Spinvolta выбирает результаты с помощью crypto.getRandomValues() — криптографически стойкого генератора случайных чисел, встроенного во все современные браузеры и системы. Тот же источник используется для создания ключей шифрования. Мы никогда не используем Math.random() для принятия решений. (Чисто декоративные вещи вроде полёта конфетти — можно.)

2. Без смещения по модулю

Случайное 32-битное число не всегда делится поровну, скажем, на 7 вариантов: 4 294 967 296 не кратно 7, поэтому наивное число % 7 делает некоторые варианты чуть вероятнее. Spinvolta использует выборку с отклонением: если число попадает в неровный остаток в верхней части диапазона, оно отбрасывается и выбирается заново. В итоге шанс каждого варианта ровно одинаков при любом их количестве.

3. Веса — точные

В режиме с весами значения вроде 1, 2,5 или 0,125 переводятся в целые числа на общей шкале и точно складываются. Одна равномерная выборка по сумме выбирает победителя, так что вариант с весом 2 ровно вдвое вероятнее варианта с весом 1 — и размеры секторов показывают именно эти шансы.

4. Несколько победителей без повторов

Несколько победителей, команды, случайный порядок, тасовка карт и розыгрыши используют несмещённую тасовку Фишера — Йетса (с той же выборкой с отклонением), поэтому любой порядок или группа победителей равновероятны.

5. Сначала результат, потом анимация

Когда вы нажимаете «Крутить», победитель определяется до того, как колесо двинется. Затем решатель рассчитывает движение — разгон, скорость, число оборотов, мягкое покачивание в конце, — которое заканчивается точно внутри выигрышного сектора, в случайной точке вдали от краёв. Сильный толчок, длинное вращение или ручная остановка меняют только вид. Наши автотесты проверяют тысячи случайных вращений, чтобы анимация всегда останавливалась на заранее выбранном результате и никогда не съезжала на соседа.

6. Доказуемо честные розыгрыши и комнаты

В розыгрышах (и везде, где важно доверие) Spinvolta идёт дальше, чтобы вам не приходилось верить ни нам, ни организатору:

  1. Перед розыгрышем браузер фиксирует точный список участников и настройки и публикует отпечаток — хеш SHA-256 списка, настроек и секретного зерна. Наш сервер записывает время получения.
  2. Отпечаток указывает будущий раунд источника случайности drand League of Entropy — публичного значения, которое каждые 3 секунды выпускают независимые организации по всему миру и которое никто не может предсказать или выбрать.
  3. Когда этот раунд опубликован, победители вычисляются из отпечатка, значения источника и зерна.
  4. Страница доказательства показывает всё. Любой может нажать Проверить и пересчитать всё в своём браузере, включая криптографическую подпись источника.

Организатор не может выбрать победителя, потому что значения источника ещё не было, когда список фиксировался. Мы тоже не можем: мы не видим зерно до фиксации отпечатка и не управляем drand. Если источник недоступен, розыгрыш переходит на явно помеченную схему «обязательство и раскрытие».

7. Проверено статистикой

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

Что мы не можем доказать

При обычном вращении вы доверяете тому, что код в вашем браузере — тот самый, что мы описываем. Он работает полностью на вашем устройстве, и его можно изучить инструментами разработчика. Когда ставки выше — призы, публичные розыгрыши, — используйте доказуемо честный розыгрыш, который не требует доверять никому.

Частые вопросы

Можно ли подкрутить колесо?

Не через анимацию: результат сначала честно выбирается, а движение рассчитывается, чтобы его показать. Шансы меняются только в режиме с весами — тогда колесо помечено «Колесо с весами», а сектора нарисованы в масштабе.

Почему одно и то же имя выпало дважды подряд?

Потому что у настоящей случайности бывают серии. При 10 вариантах один и тот же выпадает дважды подряд в 10% случаев. Включите режим выбывания, если каждый вариант должен выпасть один раз.

Что такое drand?

drand — распределённый источник случайности, который поддерживает League of Entropy — объединение независимых университетов, компаний и организаций. Он публикует новое проверяемое случайное значение каждые несколько секунд.