← Vissza a Bloghoz

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

Tools & FairnessMar 30, 2026·7 perc olvasás
Random number generator fairness audit

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:

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:

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

  1. Entrópiaforrás — Az RNG kriptográfiai forrásból származik? (Nem Math.random, nem időbélyegek)
  2. Egyenletességi teszt — Futtasson le 10 000+ mintát, és alkalmazzon khi-négyzet tesztet. p-értéknek > 0,05
  3. kell lennie
  4. Modulo bias — A kód elutasító mintavételt vagy elfogulatlan leképezési módszert használ?
  5. Függetlenség — A szekvenciális húzások korrelálnak? Futtasson le egy autokorrelációs tesztet nagy mintakészleteken
  6. 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
  7. Szűrőnyilatkozat – Szűrtek, újragörgetnek vagy kizártak-e eredményeket? Ezt közölni kell
  8. 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:

  1. 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
  2. Futtassa le a sorsolást: Használja a magot, hogy eredményeket generáljon determinisztikus algoritmussal
  3. 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:

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