Как выбирается вариант

Коротко: вариант выбирается генератором случайных чисел браузера ещё до того, как колесо начнёт крутиться, а угол доворота считается уже под выбранный вариант. Ниже — почему именно так и что из этого можно проверить самому.

Порядок действий важнее самого генератора

Очевидный способ сделать колесо — крутить диск на случайный угол и потом смотреть, какой сектор оказался под стрелкой. Так делать нельзя. Угол поворота задаётся кривой замедления, и у неё есть места, где она заканчивается чаще: результат перестаёт быть равномерным, хотя код выглядит честным. Проявляется это только на больших числах прогонов — то есть ровно тогда, когда уже поздно.

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

Чем выбирается номер

crypto.getRandomValues — тот же источник случайности, на котором браузер строит ключи шифрования. Обычного Math.random хватило бы для «кому мыть посуду», но колесо крутят и на деньги, а объяснять разницу в спорной ситуации проще, когда её нет.

Отдельно убрано смещение от остатка деления. Генератор выдаёт число из диапазона в четыре миллиарда с лишним; если поделить его на шесть вариантов с остатком, первые варианты окажутся чуть вероятнее остальных. На шести пунктах перекос — доли процента, но он есть, поэтому числа, попадающие в неполный хвост диапазона, отбрасываются и генератор опрашивается заново. Это единственное место, где колесо сознательно делает лишнюю работу.

Что можно проверить, не доверяя нам

Что при вращении нет обращений к серверу. Откройте инструменты разработчика, вкладку «Сеть», и покрутите колесо — список запросов останется пустым. Выбор целиком в браузере, значит подменить его на нашей стороне физически нечем.

Что код читается глазами. Файл /assets/app.js отдаётся как есть, без сборки и минификации. Функция выбора занимает десяток строк, а рядом с ней лежит функция обратной проверки: она отвечает, какой сектор стоит под стрелкой при заданном угле. Вызовите в консоли kfSelfTest() — она прогоняет обе функции на 2, 3, 7, 11 и 100 секторах со всеми индексами и возвращает true, если под стрелкой каждый раз оказался выбранный вариант.

Чего у нас нет, и обещать этого мы не будем: публичного журнала результатов, который зритель мог бы сверить сам. Если спор идёт о деньгах и нужна проверяемая запись, колесо на сайте — не тот инструмент. Честнее сказать это прямо, чем нарисовать галочку «проверено».

Зачем инструмент устроен именно так — в описании проекта. Что это значит для трансляции, где результат смотрят зрители, — на странице о колесе в стриме.