Как Namesome выбирает
Коротко: ваш браузер выбирает имя криптографическим генератором случайных чисел ещё до того, как колесо тронется. Ниже — подробно, и как это проверить.
Откуда берётся случайность
Каждый выбор начинается с crypto.getRandomValues — генератора случайных чисел, встроенного в ваш браузер и инициализируемого операционной системой. Это тот же источник, что защищает соединения, а не арифметический короткий путь, которым обходится большинство анимаций. Имя выбирается в момент нажатия на «Крутить»; анимация — способ показать вам уже принятое решение, и поэтому ничто в жесте — с какой силой вы крутанули, как долго держали — не может его изменить.
Веса меняют шансы намеренно, и вместе с ними меняется ширина секторов, — картинка совпадает с тем, что происходит на самом деле.
Одно исключение, сказанное прямо: если в подарочном розыгрыше столько правил «не может достаться», что случайный отбор не находит подходящего результата, Namesome возвращается к перемешанному решению, построенному из самих правил. Такой результат — действительный розыгрыш, но не равновероятный, и это единственное место на сайте, где эти два понятия расходятся.
Проверьте сами
Проведите пятьдесят тысяч вращений в этом браузере и сравните результат с критерием хи-квадрат. Колёса с равными секторами попадают в ожидаемый разброс; колёса с весами оказываются рядом со своими весами. Никуда ничего не отправляется — проверка идёт на вашей машине.
Проверка распределения
Тест 2 даёт трём вариантам веса 1, 2 и 3: сектор втрое больше выпадает втрое чаще — это и измеряют его числа.
Как устроена проверка
Каждый выбор берёт 64 свежих бита из crypto.getRandomValues — того же генератора, которым браузер делает ключи, — превращает их в число в промежутке [0, 1) и идёт по весам вариантов, пока не попадёт в один. Ни жест, ни время, ни анимация к результату не причастны: имя существует ещё до того, как колесо тронется.
Оба теста — критерий согласия хи-квадрат Пирсона. Статистика складывает (получилось − ожидалось)² ÷ ожидалось по всем вариантам, поэтому маленькое число означает, что счётчики лежат там, где их оставил бы равномерный выбор. Тест 1 берёт восемь вариантов с одинаковым весом: 7 степеней свободы, критическое значение 24,322. Тест 2 берёт веса 1, 2 и 3, то есть доли должны быть одна шестая, одна треть и половина: 2 степени свободы, критическое значение 13,816. Оба критических значения даны при p = 0.001.
На таком пороге совершенно здоровый механизм всё равно не проходит примерно один прогон из тысячи. Одна неудача — просто запустите ещё раз; две подряд означают настоящую ошибку.
Розыгрыши, которые может проверить любой
Когда людям нужно доказательство — кто выступает первым, кто в графике дежурств, какое имя вынули из шляпы, — запись розыгрыша превращает выбор в то, что может повторить посторонний. В записи есть сам список, настройки, зерно и отпечатки, а ещё кнопка, которая пересчитывает всё прямо у вас на глазах.
Обязательство, затем раскрытие
Прежде чем результат появится, мы публикуем отпечаток: SHA-256 от секретного зерна, списка и ID розыгрыша. Результат выводится из этого зерна уже потом, и зерно публикуется вместе с ним. Поскольку отпечаток стал публичным первым, мы не могли переигрывать снова и снова, пока ответ нам не понравится, — отпечаток перестал бы совпадать.
Обязательство
46cc3578fe29c825a7134c9ba9b5b43d346147d11f2e5264f806f92b943b8b17Зерно
49114b046bdfc2b0b62c1366dfc097dbb5d2aba0fe251e2c6c8516c4d44696f4ns-draw-v1 в десяти строках
Список нормализуется и сортируется, затем хешируется SHA-256. Порядок — перемешивание Фишера — Йетса на потоке HMAC-SHA256 с зерном в качестве ключа, а выбранные имена — первые в этом порядке. Те же входные данные дают тот же результат на любой машине и на любом языке.
// Excerpt of ns-draw-v1. sha256Hex, unhex and next32 are on the record page.
const entries = [...record.entries].map(s=>s.normalize('NFC')).sort();
const entriesHash = await sha256Hex(te.encode(JSON.stringify(entries)));
const commitment = await sha256Hex(te.encode(
record.seed + '|' + entriesHash + '|' + record.id));
const key = await crypto.subtle.importKey('raw', unhex(record.seed),
{name:'HMAC', hash:'SHA-256'}, false, ['sign']);
const arr = [...entries];
for (let i = arr.length-1; i > 0; i--){
const bound = i+1, lim = Math.floor(0x100000000/bound)*bound;
let r; do { r = await next32(); } while (r >= lim);
const j = r % bound; [arr[i],arr[j]] = [arr[j],arr[i]];
}
return { entriesHash, commitment, order: arr, winners: arr.slice(0, record.winners) };Фрагмент — вспомогательные функции, которые он вызывает, и кнопка, запускающая всё заново прямо у вас на глазах, находятся на странице записи розыгрыша.
Чего мы не делаем никогда
Мы никогда не берём деньги за розыгрыш. В Namesome нет ни билетов, ни взносов за участие, ни призов, ни шансов на выигрыш, а условия запрещают использовать его для азартных игр. Он выбирает имена; в этом вся работа.
Так задумано: здесь просто нет ничего, что указывало бы на деньги.
Для агентов и программ
API и сервер MCP возвращают те же записи с теми же отпечатками, поэтому один ассистент может проверить розыгрыш другого. В каждом ответе есть ссылка на страницу, которую может прочитать человек.