1. Každý výsledek pochází z kryptografického generátoru náhodných čísel
Spinvolta losuje výsledky pomocí crypto.getRandomValues(), kryptograficky bezpečného generátoru náhodných čísel, který je v každém moderním prohlížeči a operačním systému — stejného zdroje, ze kterého vznikají šifrovací klíče. K rozhodování nikdy nepoužíváme Math.random(). (Čistě ozdobné věci, třeba kam odletí kousek konfet, ho používat smí.)
2. Žádné zkreslení modulem
Náhodné 32bitové číslo nejde vždy férově rozdělit třeba mezi 7 možností: 4 294 967 296 není dělitelné 7, takže naivní číslo % 7 dělá některé možnosti nepatrně pravděpodobnějšími. Spinvolta používá zamítací výběr: pokud číslo padne do nerovnoměrného zbytku na vrcholu rozsahu, zahodí se a losuje se znovu. Každá možnost tak má přesně stejnou šanci, ať je možností kolik chce.
3. Váhy jsou přesné
Ve váženém režimu se váhy jako 1, 2,5 nebo 0,125 převedou na celá čísla na společné stupnici a přesně sečtou. Jediný rovnoměrný los přes celý součet vybere vítěze, takže možnost s váhou 2 je přesně dvakrát pravděpodobnější než možnost s váhou 1 — a velikosti výsečí na kole ukazují přesně tyto šance.
4. Více vítězů bez opakování
Více vítězů, týmy, náhodné pořadí, míchání karet i soutěže používají nestranné míchání Fisher-Yates (se stejným zamítacím výběrem), takže každé možné pořadí nebo skupina vítězů je stejně pravděpodobná.
5. Nejdřív výsledek, pak animace
Jakmile stisknete Roztočit, je vítěz určen dřív, než se kolo pohne. Pak řešič vypočítá pohyb — nápřah, rychlost, počet otáček, jemné dohoupání — který přesně dopadne do vítězné výseče, na náhodné místo dál od okrajů. Silnější švih, delší točení nebo ruční zastavení mění jen vzhled. Naše automatické testy spouštějí tisíce náhodných roztočení, aby ověřily, že animace vždy dopadne na předem vylosovaný výsledek a nikdy nesklouzne k sousedovi.
6. Prokazatelně férové losování pro soutěže a místnosti
U soutěží (a u každého losování, kde záleží na důvěře) jde Spinvolta dál, abyste nemuseli věřit nám ani organizátorovi:
- Před losováním váš prohlížeč uzamkne přesný seznam účastníků a nastavení a zveřejní otisk — hash SHA-256 seznamu, nastavení a tajného semínka. Náš server zaznamená, kdy ho přijal.
- Otisk určuje budoucí kolo majáku náhody drand League of Entropy — veřejné hodnoty, kterou každé tři sekundy vytvářejí nezávislé organizace po celém světě a kterou nikdo nemůže předpovědět ani zvolit.
- Jakmile se toto kolo objeví, vítězové se vypočítají z otisku, hodnoty majáku a semínka.
- Stránka důkazu ukazuje všechno. Kdokoli může stisknout Ověřit a vše přepočítat ve vlastním prohlížeči, včetně kryptografického podpisu majáku.
Organizátor nemůže zvolit vítěze, protože hodnota majáku v okamžiku uzamčení seznamu ještě neexistovala. My také ne, protože semínko nikdy nevidíme dřív, než je otisk uzamčen, a drand neřídíme. Když je maják nedostupný, losování přejde na zřetelně označený režim závazku a odhalení.
7. Statisticky testováno
Naše testovací sada při každé změně spouští testy chí-kvadrát na stovkách tisíc simulovaných losů a v plné verzi na více než milionu: rovnoměrné losy, vážené losy, míchání i pozice u více vítězů. Vlastní verzi si můžete spustit na stránce test férovosti.
Co dokázat neumíme
U běžného roztočení věříte, že kód ve vašem prohlížeči je ten, který popisujeme. Běží celý ve vašem zařízení a můžete si ho prohlédnout ve vývojářských nástrojích prohlížeče. Když jde o víc — o ceny nebo veřejná losování — použijte prokazatelně férové losování, při kterém nemusíte věřit nikomu.
Časté dotazy
Dá se kolo zmanipulovat?
Animací ne: výsledek se nejdřív férově vylosuje a pohyb se vypočítá jen proto, aby ho ukázal. Šance se dají změnit jen váženým režimem, který zobrazí štítek „Vážené kolo“ a kreslí výseče ve správném poměru.
Proč padlo stejné jméno dvakrát za sebou?
Protože skutečná náhoda má série. S 10 možnostmi padne totéž dvakrát za sebou v 10 % případů. Pokud má každá možnost padnout jen jednou, použijte vyřazování.
Co je drand?
drand je distribuovaný maják náhody provozovaný League of Entropy, skupinou nezávislých univerzit, firem a organizací. Každých pár sekund zveřejní novou ověřitelnou náhodnou hodnotu.