Moet u een winnaar van een tombola loten, een leerling de beurt geven of bepalen wie de afwas doet? Deze willekeurige kiezer voor Vlaanderen kiest eerlijk uit elke lijst die u plakt. Plaats uw elementen in het vak 'Elementen' — één per regel of gescheiden door komma's —, stel het gewenste aantal in bij 'Aantal' en druk op 'Genereren'. Een lijst heeft minstens twee elementen nodig en biedt plaats aan maximaal 1000 items van elk maximaal 200 tekens.
Elke trekking vindt direct in uw browser plaats via de Web Crypto API (crypto.getRandomValues), die cryptografisch veilige willekeurige waarden levert vanuit het onderliggende systeem van uw browser. Uw lijst wordt nooit naar een server gestuurd, nooit bewaard en nooit door ons gezien — en dat is hier nog belangrijker dan bij de meeste generatoren, omdat mensen vaak klantenlijsten, klassenlijsten of namen van collega's plakken. 'Laden uit bestand' biedt dezelfde garantie: uw browser leest zelf het bestand en vult het vak lokaal, zonder dat er iets wordt geüpload.
De opties zijn gemaakt voor de lijsten die mensen in de praktijk gebruiken. Het 'Scheidingsteken' staat op 'Automatisch', wat zelf het onderscheid maakt tussen nieuwe regels en komma's. Hierdoor werkt een lijst die is gekopieerd uit een spreadsheet, chatbericht of document zonder dat u de opmaak hoeft aan te passen. Zet hem vast op 'Nieuwe regel', 'Komma' of 'Spatie' wanneer uw gegevens formaten door elkaar gebruiken. Let op dat 'Spatie' altijd een handmatige keuze is en nooit automatisch gebeurt, omdat items zoals volledige namen zelf spaties bevatten en deze standaard splitsen de meeste lijsten zou verpesten. Het 'Aantal' bepaalt hoeveel elementen er worden geloot, van 1 tot 100. Trekt u drie winnaars uit 200 deelnemers? Plak de namen, zet het 'Aantal' op 3 en druk op 'Genereren'. Twee bedieningselementen zijn pas van toepassing wanneer het aantal 2 of meer is en blijven tot die tijd grijs: 'Zonder dubbelen', dat bepaalt of hetzelfde element twee keer getrokken kan worden, en het 'Uitvoerformaat', dat bepaalt hoe de keuzes worden gescheiden ('Elk op een nieuwe regel', 'Gescheiden door spaties' of 'Gescheiden door komma's').
Een rij knoppen binnen het vak 'Elementen' vervangt het bewerken dat u anders ergens anders zou doen. 'Laden uit bestand' haalt een lijst rechtstreeks uit een tekstbestand of CSV. 'Schudden' husselt de elementen in het vak door elkaar, 'Sorteer' zet ze in alfabetische volgorde (waarbij getallen op een natuurlijke manier worden gesorteerd en een tweede klik de volgorde omdraait), en 'Wissen' maakt het vak leeg. 'Vul met voorbeeldgegevens' voegt een korte voorbeeldlijst in zodat u de kiezer met één klik kunt proberen, terwijl 'Uitbreiden zodat de inhoud past' het vak uitvouwt om een lange lijst volledig te tonen, en 'Samenvouwen naar standaardgrootte' het weer verkleint. Onder het resultaat plaatst 'Alles kopiëren' elke trekking op uw klembord, 'Bewaren als bestand' downloadt de uitslag, en de 'Geschiedenis' bewaart uw laatste 10 trekkingen in uw browser, zodat een eerder resultaat altijd binnen handbereik is.
Hoe wordt de keuze daadwerkelijk gemaakt? Wanneer u op 'Genereren' drukt, vraagt de pagina de browser om willekeurige waarden via crypto.getRandomValues en gebruikt deze om posities in uw lijst te kiezen, in plaats van een pseudowillekeurige JavaScript-functie zoals Math.random() te gebruiken. Het omzetten van een ruwe 32-bit waarde naar een positie is waar kiezers ongemerkt de fout in gaan: de waarde delen via modulo door de lengte van de lijst is de meest voor de hand liggende aanpak, maar deze is bevooroordeeld. Tenzij de lengte van de lijst precies in 2^32 past, komen elementen aan het begin van de lijst iets vaker voor dan de rest (modulo-bias). Deze kiezer negeert daarentegen elke waarde boven het grootste exacte veelvoud van de lijstlengte en trekt opnieuw — een techniek die rejection sampling (acceptatie-verwerping) wordt genoemd. Het kost een paar extra trekkingen, maar biedt een exacte garantie in plaats van een geschatte. De positie in de lijst verandert niets: het eerste en het laatste element hebben bij elke trekking exact dezelfde kans.
'Zonder dubbelen' maakt onderscheid tussen twee wezenlijk verschillende soorten trekkingen, en de statistiek heeft voor elk een naam. Als dit is ingeschakeld, schudt de kiezer een kopie van uw lijst met het Fisher-Yates algoritme en pakt hij de bovenste elementen — alsof u lootjes trekt uit een hoed zonder ze terug te leggen. Hierdoor wordt niemand twee keer gekozen en is elke groep van die grootte even waarschijnlijk. Dat is trekken zonder terugleggen (sampling without replacement), en dit is wat u wilt gebruiken voor prijswinnaars, teams en beurten. Als dit is uitgeschakeld, wordt elke keuze onafhankelijk van de hele lijst gemaakt, waardoor hetzelfde element vaker dan eens naar voren kan komen: trekken met terugleggen (sampling with replacement). Dit is handig wanneer iedereen in elke ronde beschikbaar blijft. Geen van beide methodes is eerlijker dan de andere; ze dienen een ander doel.
Voor het menselijk oog ziet een volkomen eerlijke loting er helemaal niet eerlijk uit. Trekt u vijf namen uit tien, dan zult u regelmatig twee keuzes zien die in de oorspronkelijke lijst naast elkaar stonden, of tweemaal achter elkaar dezelfde naam als dubbelen zijn toegestaan — en dit is allemaal de normaalste zaak van de wereld. Elke trekking is onafhankelijk: eerdere keuzes hebben absoluut geen invloed op latere keuzes, en niemand is ooit aan de beurt omdat hij eraan 'toe' zou zijn. Het instinct dat het tegendeel beweert is de gokkersmisvatting (gambler's fallacy). Het is ditzelfde instinct dat ons zo slecht maakt in zelf willekeurig kiezen: als ons gevraagd wordt willekeurig te kiezen, vermijden we het eerste en laatste element, herhalen we liever geen namen en verspreiden we onze keuzes veel gelijkmatiger dan het toeval ooit doet. Een resultaat dat er verdacht netjes uitziet, draagt de vingerafdruk van een mens; echte willekeur produceert klontjes.
Waarom kiezen voor deze willekeurige kiezer?
- Werkt alleen in de browser: uw lijst wordt gelezen op uw apparaat en nergens heen gestuurd
- Willekeur via Web Crypto API: cryptografisch veilig, geen Math.random()
- Geen modulo-bias: rejection sampling houdt de kans voor elk element gelijk
- Elke lijstvorm: per regel, via komma of spatie, zonder de opmaak aan te passen
- Modus 'Zonder dubbelen': vorm teams of trek winnaars zonder herhalingen
- Tot 1000 elementen en maximaal 100 keuzes in één enkele trekking
- Ingebouwde lijsttools: laden uit bestand, schudden, sorteren, wissen, voorbeeldgegevens
- Geschiedenis en Bewaren als bestand: houd een bewijs bij van een loting die u mogelijk moet verantwoorden
- Ongelimiteerd en gratis: geen registratie, geen gebruikslimieten, niets op onze servers
Willekeurig loten komt overal voor waar een keuze niet ter discussie mag staan. Op school geven docenten leerlingen de beurt zonder voortrekkerij en verdelen ze de klas in projectgroepjes. In Vlaanderen verloten we prijzen op een tombola van de jeugdbeweging of school, en trekken we namen voor een cadeautjesuitwisseling op het werk, waarbij iedereen op de uitslag moet kunnen vertrouwen. Op kantoor bepalen teams de volgorde van presentaties of verdelen ze de taken die niemand wil doen. Bij onderzoek trekt men een willekeurige steekproef van dossiers voor een audit. In het gezin maakt het een einde aan de discussie over welke film er gekeken wordt of welk restaurant het wordt. De rode draad is een selectie die door iedereen achteraf kan worden uitgelegd: de loting gebruikt cryptografische willekeur, vindt volledig op uw apparaat plaats, en de 'Geschiedenis' bewaart het resultaat voor het geval iemand er later naar vraagt.
Deze kiezer heeft enkele eerlijke limieten die goed zijn om te weten. Hij kan niet meer unieke elementen trekken dan uw lijst bevat — drie winnaars van een tombola hebben minimaal drie namen nodig — en hij stopt bij 1000 elementen van elk 200 tekens, met een maximum van 100 keuzes in één loting. 'Schudden' en 'Sorteer' werken regel voor regel, dus een door komma's gescheiden lijst die op één regel is geplakt, wordt pas herordend als elk element op een nieuwe regel staat. Bovendien herschikken ze allebei het vak in plaats van de loting, die even eerlijk is in welke volgorde uw elementen ook staan. Elk element heeft qua ontwerp ook exact hetzelfde gewicht, dus voor een loting waarbij één naam dubbel moet tellen, moet die naam ook twee keer worden ingevoerd. Binnen deze grenzen is de garantie onomstotelijk: elk element in uw lijst heeft exact dezelfde kans, bij elke afzonderlijke trekking.