Inte alla slumpmässighet är lika. Skillnaden mellan en pseudo-slumpmässig talgenerator och en kryptografiskt säker bestämmer om din myntflip, tärningsrulle eller namndragning är verkligt rättvis - eller tyst förutsägbar.
En slumptalsgenerator (RNG) är en algoritm eller hårdvaruenhet som producerar en sekvens av siffror utan urskiljbart mönster. Datorer står inför ett grundläggande problem här: de är deterministiska maskiner. Med tanke på samma starttillstånd kommer en CPU alltid att producera samma produktion. Sann hårdvara slumpmässighet kräver en extern källa till oförutsägbarhet - kallad entropi - som termiskt buller, disk timing variation eller mus rörelse.
Software RNGs löser detta genom att antingen samla in verklig entropi från operativsystemet eller genom att använda en matematisk formel för att simulera slumpmässighet. Dessa två metoder ger mycket olika resultat.
En pseudo-slumpmässig talgenerator (PRNG) börjar från det interna tillståndet och tillämpar en deterministisk algoritm för att producera varje successivt nummer. Utgången kan se slumpmässig ut, men samma ursprungliga tillstånd producerar samma sekvens.
JavaScripts Math.random() använder en implementeringsdefinierad PRNG. JavaScript-specifikationen kräver inte en viss algoritm och gör uttryckligen inte utgången kryptografiskt säker. Det är därför olämpligt när oförutsägbarhet eller revisionsbar rättvisa ärenden.
För de flesta ändamål - animationer, blanda en spellista, plocka en slumpmässig bakgrundsfärg - det spelar ingen roll. Men för allt där rättvisa står på spel (vägar, lagdragningar, spelresultat), förutsägbarhet är ett verkligt problem.
En kryptografiskt säker pseudo-slumpmässig talgenerator (CSPRNG) är utformad så att tidigare utgångar inte gör framtida utgångar praktiskt taget förutsägbara. Jämfört med en allmänt ändamål PRNG, det ger egenskaper som behövs av säkerhetskänsliga och rättvisa känsliga tillämpningar:
Webbläsare får kryptografiskt starka värden från operativsystemanläggningar. De exakta entropi källor och algoritmer är plattformsdetaljer, så webbapplikationer bör använda Web Crypto API snarare än att försöka samla in eller hantera entropi själva.
crypto.getRandomValues()Webbläsare exponerar CSPRNG-funktionalitet genom Web Crypto API. Nyckelfunktionen är crypto.getRandomValues (typedArray), som fyller en skriven array med kryptografiskt slumpmässiga byte från OS-entropipoolen.
För att generera ett opartiskt heltal i ett intervall läser Randly ett 32-bitars värde (eller kombinerar värden för bredare säker-integer-intervall) och avvisar den korta svansen som annars skulle skapa modulobjektiv:
funktion randomUint32() {
const array = ny Uint32Array (1);
crypto.getRandomValues (array);
returnera array[0];
}
funktion randomInt (min, max)
Const range = max - min + 1;
Const limit = Math.floor(2 * 32 / intervall) * intervall;
Låt värdet;
värde = randomUint32(); medan (värde >= gräns);
returnera min + (värde %);
}
Ett Uint32Array ger 232 möjliga värden; Randly kombinerar 53 bitar när en bredare säker-integer sortiment behövs. Avslagsprovtagning garanterar varje utgång i det begärda intervallet motsvarar samma antal källvärden, så inget resultat får en större andel bara för att det begärda intervallet inte delar källområdet jämnt.
För de flesta tillfälliga användningar är distinktionen osynlig. Men överväga en klassrumslärare som använder en namnväljare för att ringa på studenter eller en organisation som kör en prisdragning. En allmänt ändamål PRNG är inte specificerad för negativ användning, medan en plattform CSPRNG är utformad för att hålla framtida värden oförutsägbara. En reviderad process är fortfarande lämplig för reglerade eller höga värden.
Varje verktyg på Randly - tärningsrullar, myntflips, namnval, hjulspins, färggenerering - använder crypto.getRandomValues() uteslutande. Genomförandet lever i en gemensam modul (en gemensam modul).lib/random.ts) exporten av typiska funktioner: RandomInt (min, max), randomIndex (längd), randomElement (array)och shuffleArray(array).
Inget samtal till Math.random() finns i någon verktygslogik. Den enda platsen standard PRNG värden visas är i Framer Motion animation parametrar (flytande element start positioner), som är rent kosmetiska och har ingen effekt på verktygsutfall.
"Klicka snabbare gör resultatet mer slumpmässigt."
Timing ditt klick har ingen effekt när du använder en CSPRNG. Entropipoolen uppdateras kontinuerligt av operativsystemet oavsett användarinteraktion.
"Att köra samma verktyg två gånger i rad ger korrelerade resultat."
Varje samtal till crypto.getRandomValues() är oberoende. Tidigare utgångar ger ingen information om framtida.
"En längre lista betyder att någon i slutet är mindre benägna att plockas."
Slumpmässigt indexval ger varje position en lika stor sannolikhet på 1/n, oavsett listlängd.
Alla Randly verktyg använder kryptografiskt säker slumpmässighet. Ingen registrering krävs.