Tisztességes az Ön véletlenszám-generátora? Gyakorlati ellenőrzési ellenőrzőlista

Amikor sorsolást indítasz, véletlenszerűen választasz ki csapatokat, vagy sorsolással osztasz ki feladatokat, a tisztesség nem kötelező – ez a lényeg. De a "véletlenszerű" nem jelenti automatikusan azt, hogy "tisztességes". A véletlenszám-generátorok (RNG-k) rejtett torzítása láthatatlan módon torzíthatja az eredményeket, hacsak nem tudja, hol keresse.
Ez a cikk gyakorlati ellenőrzőlistát ad bármely RNG ellenőrzéséhez a méltányosság érdekében, függetlenül attól, hogy a Véletlenszám-generátorunkat használja, vagy sajátot épít.
Mit jelent a méltányosság a felhasználók számára készült sorsolásoknál?
Egy tisztességes RNG olyan eredményeket ad, ahol:
- Uniformitás — minden eredménynek egyenlő a valószínűsége (egyenletes eloszlás esetén)
- Függetlenség — a sorsolást nem érintik a korábbi sorsolások
- Kiszámíthatatlanság — egyetlen megfigyelő sem tudja jobban megjósolni a következő eredményt, mint a véletlen
- Igazolhatóság – a résztvevők megerősíthetik, hogy a folyamatot nem manipulálták
Ha ezek közül bármelyik hiányzik, megtöri a bizalmat, még akkor is, ha az eredmények véletlenszerűnek tűnnek.
A torzítás gyakori forrásai
Rossz magvak
A PRNG (pszeudo-véletlenszám-generátor) csak annyira kiszámíthatatlan, mint a magja. Gyakori rossz magvak:
- Aktuális időbélyeg — ezredmásodpercig előre jelezhető; egy támadó, aki nagyjából tudja, mikor fut le a sorsolás, képes reprodukálni az eredményt
- Szekvenciális számlálók – egyáltalán nem véletlen
- Felhasználói bevitel — a résztvevők módosíthatják
Mindig kriptográfiai forrásból indítson: crypto.getRandomValues() böngészőben, /dev/urandom Linuxon, vagy crypto.randomBytes() a Node.js-ben.
Modulo Bias
Egy kifinomult és gyakori hiba: a modulo operátor használata egy véletlen szám tartományra való csökkentésére.
// BIASED — ha az RNG tartomány nem 6 többszöröse,
// egyes kimenetelek valamivel valószínűbbek
const roll = randomUint32() % 6; // HELYES — elutasító mintavétel
function fairDiceRoll() { const max = Math.floor(0xFFFFFFFF / 6) * 6; legyen érték; do { value = crypto.getRandomValues(new Uint32Array(1))[0]; } while (érték >= max); visszatérési érték % 6;
}Egy 6-oldalas kocka esetében a modulo torzítás 32 bites egész számmal csak ~0,00000009%. De nagyobb tartományok vagy 8 bites értékek esetén ez jelentőssé válik.
Rejtett szűrők
Egyes sorsolási rendszerek csendben kizárnak bizonyos eredményeket (pl. a "legutóbbi nyertesek" kiszűrése vagy a kezelőnek nem tetsző eredmények újragörgetése). Ez még akkor is sérti a méltányosságot, ha a mögöttes RNG tökéletes. A sorsolás előtt dokumentálja és tegye közzé a szűrési szabályokat.
Audit ellenőrző lista üzemeltetők számára
- Entrópiaforrás — Az RNG kriptográfiai forrásból származik? (Nem Math.random, nem időbélyegek)
- Egyenletességi teszt — Futtasson le 10 000+ mintát, és alkalmazzon khi-négyzet tesztet. p-értéknek > 0,05 kell lennie
- Modulo bias — A kód elutasító mintavételt vagy elfogulatlan leképezési módszert használ?
- Függetlenség — A szekvenciális húzások korrelálnak? Futtasson le egy autokorrelációs tesztet nagy mintakészleteken
- Kód felülvizsgálata — A sorsolási kód nyílt forráskódú vagy auditálható? A rejtett kód hátsó ajtókat tartalmazhat
- Szűrőnyilatkozat – Szűrtek, újragörgetnek vagy kizártak-e eredményeket? Ezt közölni kell
- Időzítés — Az operátor láthatja az eredményeket közzététel előtt? Ha igen, szelektíven eldobhatják a kedvezőtlen húzásokat
Átlátszósági minta nyilvános tombolákhoz
A nagy tétű sorsolásokhoz (díjak, feladatok, válogatások) használjon commit-reveal sémát:
- A sorsolás előtt: Véletlenszerű magot generál. Tegye közzé az SHA-256 hash-jét (a "kötelezettségvállalást") – például a közösségi médiában vagy egy időbélyegzett dokumentumban
- Futtassa le a sorsolást: Használja a magot, hogy eredményeket generáljon determinisztikus algoritmussal
- A sorsolás után: Tedd közzé a magot. Bárki ellenőrizheti, hogy:
- A mag létrehozza a közzétett hash-t
- A seed + algoritmus elkészíti a bejelentett eredményeket
Használja Hash Generatorunkat a kötelezettségvállalási hash létrehozásához és ellenőrzéséhez.
// Elkötelezettségvállalási szakasz
const seed = crypto.randomBytes(32).toString('hex');
const kötelezettségvállalás = sha256(mag); // ezt közzé kell tenni a sorsolás előtt // Rajz fázis
const eredmény = determinisztikusDraw(mag, résztvevők); // Felfedezési fázis
// mag közzététele — bárki ellenőrizheti a sha256(seed) === elkötelezettséget A méltányosság kommunikálása a felhasználókkal
A bizalom átláthatóságot igényel. Nyilvános húzások futtatásakor:
- Adja meg a használt RNG metódust (pl. "Web Crypto API")
- Tegye közzé a rajzolási algoritmust (még a pszeudokód is segít)
- A commit-reveal használata az ellenőrizhetőség érdekében
- rajzi naplók rögzítése és közzététele időbélyegekkel
- Az eredmények ellenőrzésének engedélyezése független megfigyelők számára
GYIK
Elég jó a Math.random?
Nem. A Math.random() pszeudo-véletlenszám-generátort (PRNG) használ, amely kriptográfiailag nem biztonságos. Kimenete megjósolható, ha a belső állapot ismert. A tisztességes sorsolás érdekében használja a crypto.getRandomValues() a böngészőben vagy a crypto.randomInt() a Node.js-ben.
Hogyan bizonyíthatom be, hogy a döntetlent nem manipulálták?
Használj commit-reveal sémát: a sorsolás előtt tedd közzé a véletlenszerű mag (commitment) hash-ét. A sorsolás után fedd fel a magot. Bárki ellenőrizheti, hogy a mag létrehozza a közzétett hash-t és a bejelentett eredményeket.
Hány mintára van szükségem az alapvető torzítási ellenőrzésekhez?
Az N eredmény egyszerű egységességének ellenőrzéséhez legalább 100 × N mintára van szüksége (pl. 1000 mintára egy 10 lehetőségből álló sorsoláshoz). Alkalmazzon khi-négyzet tesztet: ha a p-érték 0,05 felett van, az eloszlás meglehetősen egyenletes. Komoly ellenőrzésekhez használjon 10 000+ mintát.
Kapcsolódó eszközök és cikkek
- Véletlenszám-generátor — kriptográfiailag tisztességes véletlenszámok
- Hash Generator — kötelezettségvállalási kivonatok létrehozása ellenőrizhető sorsolásokhoz
- Miért használjunk PIN-generátort? — biztonságos véletlenszerű PIN-kódok
- Digitális higiéniai ellenőrzőlista – általános biztonsági gyakorlatok