We hebben een kleine weggeefactie uitgevoerd voor de lancering van Toolz, en ik heb de trekking op de luie manier gedaan: ik heb de deelnemerslijst in een spreadsheet geplakt en een kolom toegevoegd =RAND(), en er op gesorteerd. 't Werd, maar een vriend die statistieken voor de kost doet, keek over mijn schouder en zei: & quot; je weet dat dat eigenlijk niet uniform is, toch? & quot; Hij had gelijk, en het konijnenhol waar ik die avond in viel, is een groot deel van waarom Toolz nu een recht heeft lijst randomizer dat doet de shuffle op de juiste manier Deze gids is wat ik heb geleerd, geschreven voor iedereen die namen uit een hoed moet halen en wil dat de hoed eerlijk is.
tl;dr: Een lijst randomizer ofwel herschikt een hele lijst willekeurig (shuffle) of trekt een willekeurige steekproef uit het (pick) De goede gebruiken de Fisher-Yates shuffle en een cryptografische willekeurige bron dus elke bestelling is even waarschijnlijk Gebruik shuffle voor de volgorde van de beurt en de zitplaatsen, en kies voor weggeefacties en monsters Deze tool draait client-side, trekt zonder vervanging door standaard dus winnaars zijn uniek, en weigert om meer unieke items te tekenen dan de lijst houdt.
Ik bouw SaaS producten op Laravel en React, dus ik geef hier om twee dingen: de wiskunde goed krijgen, en de interface duidelijk genoeg maken dat je je nooit afvraagt of de trekking eerlijk was Beide blijken er meer toe te doen dan dat ze klinken.
Wat is een lijst randomizer?
Een lijst randomizer neemt een lijst met items, één per regel, en herschikt of bemonstert deze willekeurig Een eerlijke shuffle is een opgelost probleem met een verkeerd antwoord dat er goed uitziet: sorteren met een willekeurige sleutel is bevooroordeeld, terwijl de Fisher-Yates shuffle dat niet is, en de browser levert de onbevooroordeelde bits door crypto.getRandomValues(). Plakken in namen, prijzen, taken, teams of ideeën, en het geeft ofwel de hele lijst terug in een geschudde volgorde of pikt het aantal winnaars op waar je om vroeg Het is de softwareversie van het tekenen van gevouwen slips uit een kom, met als voordeel dat het de stille vooroordelen wegneemt die mensen introduceren wanneer ze proberen " willekeurig" met de hand.
Er zijn echt maar twee bewerkingen, en weten welke je wilt is de hele vaardigheid Shuffle retourneert elk item dat je het hebt gegeven, gewoon in een nieuwe willekeurige volgorde, dus er wordt niets toegevoegd of verloren Pick retourneert een subset, waarbij een vast aantal items uit de pool wordt getrokken Een loterij is een keuze Beslissen wie als eerste presenteert in een stand-up is een shuffle De meeste mensen grijpen minstens één keer naar de verkeerde, meestal proberen ze te "eren; schudden en de bovenste drie en quot nemen; wanneer Pick met een telling van drie hetzelfde doet in één stap.
Hoe werkt een eerlijke shuffle eigenlijk?
Hier is het deel waar mijn statisticusvriend op uit was De spreadsheet truc, het toewijzen van een willekeurig getal aan elke rij en het sorteren, voelt willekeurig maar is niet uniform Sorteeralgoritmen maken vergelijkingen, en wanneer twee willekeurige sleutels toevallig dichtbij zijn, kleine vooroordelen in hoe banden en vergelijkingen lekken in het resultaat op. Op kleine lijsten is de scheefheid klein, maar het is reëel, en voor alles waar eerlijkheid het punt is, & quot; close enought; is geen goed antwoord.
De juiste methode is de Fisher-Yates shuffle, ook wel de Knuth shuffle genoemd nadat Donald Knuth de ter plaatse geplaatste versie populair maakte. Het werd in 1938 beschreven door Ronald Fisher en Frank Yates en kreeg zijn moderne computervorm door Richard Durstenfeld in 1964. Het idee is eenvoudig. Loop de lijst van het laatste item naar het tweede. Kies op elke positie een willekeurige index vanaf het begin van de lijst tot en met de huidige positie en wissel vervolgens de twee items om. Omdat elke ruil tekent vanuit een krimpend, goed gedefinieerd bereik, komt elk van de mogelijke volgorden met exact gelijke waarschijnlijkheid naar buiten. Het loopt in lineaire tijd, raakt elk item één keer aan en heeft geen extra geheugen nodig.
de lijst randomizer gebruikt dit algoritme direct Wanneer je kiest zonder vervanging, is het dezelfde shuffle die vroeg gestopt is: shuffle de lijst, dan neem de eerste N items Dat garandeert dat de winnaars verschillend zijn en dat elke mogelijke groep winnaars even waarschijnlijk is.
Waar komt de willekeur vandaan?
Een algoritme is slechts zo eerlijk als de willekeurige getallen die het voeden Als de bron van willekeur voorspelbaar of bevooroordeeld is, levert een perfecte shuffle nog steeds een scheef resultaat op. Dit is waar de browser zijn geld verdient.
Moderne browsers blootleggen crypto.getRandomValues, onderdeel van de W3C Web Cryptography API, die een array vult met cryptografisch sterke willekeurige waarden die uit de entropiepool van het besturingssysteem worden getrokken Dat is een veel sterkere bron dan Math.random, dat is een snelle pseudo-willekeurige generator die nooit bedoeld is voor iets waar voorspelbaarheid van belang is De randomizer geeft de voorkeur crypto.getRandomValues en valt alleen terug naar Math.random wanneer de cryptobron echt niet beschikbaar is, wat in een huidige browser bijna nooit het geval is.
Er is nog een subtiliteit die ik goed moest krijgen Om een willekeurig 32-bits getal om te zetten in een onbevooroordeelde index van 0 tot N min 1, kun je niet zomaar de rest nemen na het delen door N, want tenzij N gelijkmatig in het bereik verdeelt, komen de lage indices iets vaker naar boven De oplossing is afstotingssteekproef: bereken het grootste veelvoud van N dat in het bereik past, en als een trekking boven die grens komt, gooi het dan weg en trek het opnieuw. Het kost een verwaarloosbaar aantal extra trekkingen en verwijdert de vertekening volledig. De tool doet dit op elke index die hij kiest, wat het soort details is dat niemand opmerkt totdat deze ontbreekt.
Hoe gebruik ik de randomizer?
De interface heeft één knop en een paar keuzes. Hier is hoe ik het uitvoer.
Plak uw lijst in het invoervak, één item per regel Als u een door komma's gescheiden cel uit een spreadsheet hebt gekopieerd, schakelt u het invoerscheidingsteken in komma's en wordt het in plaats daarvan gesplitst op komma's. Het trim- en drop-blank-gedrag is standaard ingeschakeld, dus verdwaalde lege regels en onbedoelde voorloopruimten worden geen fantoominvoer.
Kies je modus Schud alles opnieuw in Pick trekt winnaars Als je Pick kiest, verschijnt er een klein paneel waarin je instelt hoeveel je moet trekken en of herhalingen zijn toegestaan Laat herhalingen uit voor een weggeefactie zodat elke winnaar een andere persoon is Zet herhalingen alleen aan als je daadwerkelijk sampling met vervanging wilt, bijvoorbeeld wanneer je dobbelsteenachtige trekkingen simuleert en dezelfde waarde legitiem kan terugkeren.
Klik op Randomiseren Je krijgt elke keer een fris, onafhankelijk resultaat, dus als je opnieuw wilt tekenen klik je gewoon opnieuw Kopieer de uitvoer met één klik om deze in je aankondiging, je ticket, of waar het resultaat ook moet leven te plakken Als je vraagt om meer unieke winnaars dan de lijst kan leveren, vertelt de tool je in plaats van rustig een korte of herhaalde lijst terug te sturen, wat een fout is die ik andere tools heb zien maken.
In de praktijk staan de lijsten die ik in plak overal op de kaart Sommige dagen is het een kolom met e-mails van klanten voor een prijstrekking, andere dagen zijn het de namen in mijn team voor wie het volgende trekverzoek beoordeelt, en zodra het elk restaurant op loopafstand was omdat niemand kon beslissen over de lunch Het gereedschap maakt niet uit wat de items zijn, alleen dat ze netjes gescheiden zijn Daarom zijn de invoeropties een seconde aandacht waard: als uw bron een spreadsheetcel is, bespaart de kommascheider u van handbewerking, en als het een rommelige kopieerplak met lege rijen is, reinigt de standaard standaard de standaardplak het stilletjes vóór de telling. Een minuut die u besteedt aan het opmaken van de invoer is een minuut die u niet besteedt aan lege invoer.
Wanneer moet ik schudden, en wanneer moet ik kiezen?
De twee modi omvatten verschillende taken, en de onderstaande tabel is het spiekbriefje dat ik wou dat ik had toen ik begon.
| Je wilt... | goed doen | Herhaalt | waarom |
|---|---|---|---|
| Beslis het spreken of draai de volgorde | Shuffle | nvt | Iedereen blijft binnen, orde is eerlijk |
| Trek één winnaar van de weggeefactie | Kies, tel 1 | Off | Enkel uniek resultaat |
| Trek verschillende prijswinnaars | Kies, tel N | Off | Duidelijke winnaars, geen double-dipping |
| Wijs mensen toe aan twee teams | Shuffle, dan splitsen | nvt | De geschudde lijst in tweeën splitsen |
| Monster met vervanging voor een sim | Kies, tel N | On | Hetzelfde item kan door het ontwerp terugkeren |
| Randomiseer een afspeellijst of leeslijst | Shuffle | nvt | Opnieuw bestellen zonder iets te laten vallen |
De vuistregel: als het aantal items hetzelfde moet blijven, schuifel dan Als je minder items eruit wilt dan je erin stopt, kies dan Teamopdracht is degene die mensen omverwerpen Schud de volledige lijst, neem dan de eerste helft als team A en de rest als team B, en beide teams zijn willekeurig en evenwichtig van grootte.
Is het eerlijk genoeg om een openbare weggeefactie te organiseren?
Ja, en de reden is de moeite waard om duidelijk te vermelden, want & quot;fair" is de volledige waarde van de tool De combinatie van een Fisher-Yates shuffle, een cryptografische willekeurige bron en afstotingssteekproeven betekent dat elke deelnemer een identieke kans heeft en dat elke mogelijke reeks winnaars even waarschijnlijk is. Dat is een sterkere garantie dan een fysieke trekking, waarbij slipgrootte, vouwen en hoe goed de kom gemengd is allemaal vooringenomenheid introduceren.
Omdat de trekking volledig in uw browser draait, kunt u het live op het scherm doen tijdens een stream of een vergadering, wat de transparantie is die mensen willen van een openbare trekking Er wordt niets naar een server verzonden, dus er is geen verborgen stap waar met het resultaat kan worden geknoeid tussen uw klik en de aankondiging Als u een audittrail wilt, scherm-record de trekking: de deelnemerslijst is zichtbaar, de klik is zichtbaar en de winnaars verschijnen onmiddellijk.
Is mijn lijst privé?
Dit is belangrijker dan het eerst lijkt, omdat de lijsten die mensen randomiseren vaak niet openbaar zijn Kandidaat shortlists, interne teamnamen, klantvermeldingen en e-maillijsten zijn allemaal gevoelig De randomizer verwerkt alles lokaal met gewoon JavaScript Uw lijst wordt nooit geüpload, gelogd of opgeslagen, en u kunt dat bevestigen in uw browsernetwerk tab, waar klikken op Randomize vuurt helemaal geen verzoek.Het blijft ook offline werken zodra de pagina is geladen.
Dat is een weloverwogen standpunt binnen Toolz, en ik schreef over de redenering in de notitie Gegevensprivacy in online tools. Een randomizer is een goed voorbeeld van waarom het ertoe doet: de invoer is vaak een lijst met echte mensen, en een lijst met echte mensen is precies het soort dingen waarvan je niet wilt dat je in een verzoeklogboek op een server zit die je nog nooit hebt gecontroleerd.
Een paar gewoontes die de trekjes schoner maken
Maak de lijst schoon voordat u tekent Schakel duplicaten uit als één persoon twee keer kan verschijnen, dus een dubbele invoer verdubbelt niet stiekem hun kansen. Het laten vallen van lege regels staat standaard aan, maar het is de moeite waard om er zeker van te zijn dat een lege lijn achterop niet is geteld.
Match de telling met de prijzen In de Pick-modus stelt u de telling in op het exacte aantal winnaars dat u nodig hebt en laat u herhalingen uit Als u drie prijzen hebt, trekt u er drie tegelijk in plaats van driemaal op een enkele trekking te klikken, waardoor het lastige geval met dezelfde naam wordt vermeden dat twee keer met afzonderlijke klikken naar voren komt.
Openlijk opnieuw tekenen, niet in het geheim Als een winnaar niet in aanmerking komt, verwijder ze dan en teken opnieuw voor degene die kijkt. De eerlijkheid komt doordat het proces zichtbaar is, en niet doordat het resultaat definitief is bij de eerste klik.
Bewaar het in de browser Zoals bij elke tool die ik verzend, is lokale verwerking de standaard omdat het sneller en privé is Als u een persoonlijke kit met kleine hulpprogramma's samenstelt, is de generator voor willekeurige getallen koppelt op natuurlijke wijze met de randomizer voor numerieke trekkingen, en de bredere Productiviteitstools voor ontwikkelaar roundup legt uit waarom een browser-first toolbox de moeite waard is om te bouwen.
Gerelateerde tools die de moeite waard zijn om te bekijken
Als willekeurige selectie een terugkerende behoefte is, zitten een paar buren dichtbij. De generator voor willekeurige getallen tekent getallen in een bereik met dezelfde willekeur van crypto-kwaliteit, wat je wilt als het ding dat je kiest een waarde is in plaats van een item uit een lijst De UUID-generator produceert unieke identificatiegegevens voor records en testgegevens De wachtwoordgenerator past dezelfde sterke willekeurige bron toe op het produceren van veilige wachtwoorden Alle drie draaien ze in de browser zonder aanmelding, precies zoals de randomizer, en ik behandel de identificatiekant van die familie in de gids voor wachtwoordgeneratoren.
Veelgestelde vragen
Hoe werkt de lijst Randomizer?
De tool leest uw lijst één item per regel en ordert vervolgens elk item of trekt de winnaars die u hebt aangevraagd. Shuffling gebruikt het Fisher-Yates-algoritme, dat de lijst één keer doorloopt en elk item verwisselt met een willekeurig gekozen eerdere positie, waardoor een uniform willekeurige volgorde wordt geproduceerd. De willekeurige posities komen uit de browser cryptografische generator, dus het resultaat is echt onbevooroordeeld.
Is de randomisatie eigenlijk eerlijk?
Ja. Het put uit crypto.getRandomValues, de cryptografische willekeurige bron die in moderne browsers is ingebouwd, en maakt gebruik van rejection sampling zodat geen enkele index zelfs iets waarschijnlijker is dan een andere Gecombineerd met de Fisher-Yates shuffle, heeft elke mogelijke volgorde van uw lijst een gelijke kans, wat eerlijker is dan handmatig shufflen of een spreadsheetsort met een willekeurige sleutel.
Hoe kies ik een willekeurige winnaar uit een lijst met namen?
Plak je namen één per regel, schakel over naar de pick-modus, stel de telling in op 1 en klik op Randomize. De tool retourneert een enkele willekeurige naam. Om meerdere winnaars tegelijk te trekken, stel je de telling hoger in en laat je herhalingen uitgeschakeld, zodat elke winnaar uniek is.
Wat is het verschil tussen shuffle en pick?
Shuffle retourneert je hele lijst in een nieuwe willekeurige volgorde, dus er wordt niets toegevoegd of verwijderd, alleen herschikt. Pick Retourneert een subset en haalt het aantal winnaars uit de lijst. Gebruik Shuffle voor beurtvolgorde of zitplaatsen en kies voor weggeefacties, monsters of het kiezen van een paar mensen uit een grotere groep.
Kan hetzelfde item meer dan eens worden gekozen?
Alleen als je herhalingen inschakelt Standaard trekt Pick mode zonder vervanging, dus elke winnaar is een ander item, dat is wat een loterij of weggeefactie nodig heeft Door herhalingen in te schakelen kan er bemonstering met vervanging plaatsvinden, waarbij hetzelfde item weer naar boven kan komen, wat handig is voor simulaties.
Waarom kan het niet meer unieke items kiezen dan mijn lijst heeft?
Zonder herhalingen moet elke winnaar een apart item zijn, dus je kunt geen tien unieke winnaars uit een lijst van acht trekken. Wanneer dat gebeurt, vertelt de tool je in plaats van een verkeerd resultaat terug te geven. Verlaag de telling om overeen te komen met uw lijstgrootte of schakel herhalingen in, zodat items kunnen worden hergebruikt.
Is mijn lijst geüpload naar een server?
Nee Alle parseren en randomisatie wordt lokaal uitgevoerd in uw browser met gewoon JavaScript, en niets wordt verzonden, gelogd of opgeslagen U kunt dit bevestigen in uw browser netwerk tab, waar geen verzoek wordt gedaan wanneer u op Randomize klikt Het werkt ook offline zodra de pagina is geladen.
Kan ik het gebruiken voor een loterij of winactie?
Ja. Plak uw deelnemers één per regel, gebruik de pick-modus met herhalingen uitgeschakeld en stel de telling in op het aantal prijzen. Elke klik trekt een nieuwe, onafhankelijke set unieke winnaars. Omdat de trekking onbevooroordeeld is en de client-side plaatsvindt, kun je deze live op het scherm uitvoeren voor transparantie.



