Generator voor willekeurige getallen

Genereer een of meerdere willekeurige getallen binnen elk bereik, met of zonder herhaling — met cryptografische willekeurigheid.

1.444 weergaven

Hoe de Getallen Echt Worden Gegenereerd

Niet elke "willekeur" is gelijk. Math.random(), beschikbaar in elke browser, is een snelle pseudo-willekeurige generator — onder de motorkap deterministisch en in principe voorspelbaar als iemand de interne staat kent, waardoor hij ongeschikt is voor alles wat beveiligingsgevoelig is, zoals trekkingen met echte inzet. Deze tool gebruikt in plaats daarvan crypto.getRandomValues(), de cryptografisch veilige willekeurige generator die in de browser is ingebouwd, die put uit de entropiebronnen van het besturingssysteem en zelfs in principe niet voorspelbaar is.

Een veilige willekeurige bron hebben lost echter maar de helft van het probleem op. Een willekeurige waarde naïef afbeelden op een specifiek bereik (bijvoorbeeld 1-100) — door random % 100 te nemen — introduceert een subtiele maar reële modulo-bias: omdat het ruwe uitvoerbereik van de generator meestal geen exact veelvoud van 100 is, worden sommige resten uiteindelijk net iets waarschijnlijker dan andere. De bias is klein, maar reëel en stapelt zich op over veel trekkingen — precies het soort ding dat niet zou mogen bestaan in een verondersteld eerlijke loterij.

De oplossing is rejection sampling (verwerpingssteekproef): in plaats van elke ruwe waarde via modulo geforceerd in het bereik te persen, worden ruwe waarden buiten bereik verworpen en wordt een nieuwe getrokken totdat deze netjes in een exact veelvoud van het doelbereik past. Dit garandeert een werkelijk uniforme verdeling — elk getal in het bereik heeft exact gelijke kans — ten koste van af en toe een of twee extra trekkingen nodig, wat bij de betrokken snelheden niet merkbaar is.

Kies een minimum, een maximum en hoeveel getallen nodig zijn; vink uniek aan om herhalingen te voorkomen, wat loterijen, prijstrekkingen, steekproeven en spellen nodig hebben wanneer dezelfde inzending niet twee keer mag winnen. Alles draait op het lokale apparaat — geen enkel getal wordt ergens verzonden of opgeslagen, en de pagina vernieuwen levert een volledig nieuwe trekking op.

Wat het Waard is om te Weten

  • Modulo-bias is onzichtbaar bij een handvol trekkingen maar wordt statistisch detecteerbaar over duizenden — rejection sampling verwijdert het volledig in plaats van het alleen te verkleinen.
  • Dat crypto.getRandomValues() "cryptografisch veilig" is, betekent dat de uitvoer niet kan worden voorspeld, zelfs niet door iemand die eerdere uitvoer heeft gezien — een eigenschap die Math.random() expliciet niet heeft en nooit is ontworpen om te hebben.
  • Het bereik is aan beide kanten inclusief: een trekking van 1-10 kan zowel 1 als 10 opleveren, niet alleen de waarden strikt daartussen.
  • Voor een controleerbare loterij nummert u deelnemers van 1 tot N, stelt u het bereik dienovereenkomstig in, schakelt u uniek in, en maakt u een schermafbeelding van het resultaat, aangezien er na de trekking niets server-side wordt opgeslagen.

Veelgestelde vragen

Zijn de getallen echt willekeurig, of gewoon "willekeurig genoeg"?

Ze komen uit crypto.getRandomValues(), dat put uit de cryptografische entropiebron van het besturingssysteem - onvoorspelbaar in principe, niet alleen in de praktijk, in tegenstelling tot het eenvoudige Math.random() dat de meeste alledaagse willekeurige-getallenscripts gebruiken.

Wat is modulo-bias en heeft deze tool dat?

Een willekeurige waarde naïef afbeelden op een bereik met random % N bevoordeelt sommige getallen licht ten opzichte van andere, omdat het ruwe bereik van de generator meestal geen exact veelvoud van N is. Deze tool vermijdt dit met rejection sampling: ruwe waarden buiten bereik worden verworpen en opnieuw getrokken totdat een uniform resultaat gegarandeerd is.

Wat is rejection sampling, in gewone taal?

In plaats van elke willekeurige waarde met een moduloberekening geforceerd in een bereik te persen, worden waarden die bias zouden introduceren simpelweg weggegooid en wordt een nieuwe getrokken - dit wordt herhaald totdat een waarde verschijnt die perfect en gelijkmatig in het bereik past. De kosten zijn af en toe een extra trekking; het voordeel is een werkelijk uniform resultaat.

Kan ik dit gebruiken voor een prijstrekking?

Ja. Nummer de deelnemers van 1 tot N, stel het bereik dienovereenkomstig in, schakel uniek in en genereer zoveel winnaars als nodig. Maak een schermafbeelding voor de administratie, aangezien resultaten na de trekking nergens worden opgeslagen.

Zijn zowel het minimum als het maximum in het bereik inbegrepen?

Ja - het bereik is aan beide kanten inclusief. Een trekking van 1-10 kan zowel 1 als 10 opleveren, precies zoals bij het trekken van genummerde briefjes uit een hoed.

Reacties

Nog geen reacties — schrijf de eerste!

Vergelijkbare tools