Zufallsauswahltool
Faires Zufallsauswahl-Tool für Verlosungen, Auswahlen und Ziehungen
Was ist ein Zufallsauswahl-Tool?
Ein Zufallsauswahl-Tool wählt einen Eintrag aus einer Liste aus, ohne dass eine Person manuell entscheidet. Es ist nützlich für Unterrichtsbeteiligung, Reihenfolgen in Meetings, kleine Giveaways, Aufgabenverteilung, Essenswahl, Team-Warm-ups und Situationen, in denen eine sichtbare neutrale Auswahl Verzerrungen reduziert. Diese Seite arbeitet mit einer zeilenweisen Liste, kann die Ziehung animieren, speichert einen lokalen Verlauf und kann Wiederholungen vermeiden, indem gezogene Einträge aus dem verbleibenden Pool entfernt werden. Zufall kann statistisch fair sein, prüft aber keine Identitäten, erkennt doppelte Namen nicht automatisch und liefert keine Audit-Nachweise. Für offizielle Gewinnspiele, Compliance, Teilnahmeberechtigung und Preisvergabe braucht es einen dokumentierten Prozess.
Anleitung
Bedienschritte
- Geben Sie die Optionen in das Textfeld ein, eine pro Zeile
- Legen Sie die Anzahl der zu ziehenden Elemente fest
- Wählen Sie, ob Duplikate erlaubt sein sollen
- Klicken Sie auf „Ziehung starten"
- Die Ergebnisse erscheinen auf der rechten Seite
Tipps für eine faire Ziehung
- Geben Sie einen Kandidaten pro Zeile ein und entfernen Sie versehentliche Leerzeichen oder Duplikate, sofern Duplikate nicht absichtlich erlaubt sind.
- Legen Sie bei öffentlichen Ziehungen vorab die Zufallsbasis, die Duplikatregel und die Neuziehungsregel fest, damit das Ergebnis leichter nachvollziehbar ist.
Anwendungsfälle
Technisches Prinzip
Das Zufallsauswahl-Tool basiert auf der Web Crypto API (W3C, WHATWG), konkret crypto.getRandomValues(typedArray), der einzigen kryptografisch sicheren Zufallsquelle, die in Browsern verfügbar ist. Im Hintergrund ruft der Browser den CSPRNG des Betriebssystems auf: CryptGenRandom auf Windows (AES-256 im CTR-DRBG-Modus seit Windows 10), getrandom(2) auf Linux (das aus demselben ChaCha20-basierten Pool liest, der auch /dev/urandom im Kernel speist), SecRandomCopyBytes auf macOS und die entsprechende Funktion auf iOS, Android und BSD. Die Ausgabe eignet sich für Schlüsselerzeugung, Nonces, Salts, IVs und überall dort, wo Vorhersagbarkeit ein Sicherheitsproblem darstellen würde. Die Unterscheidung „kryptografische Qualität“ ist entscheidend. Math.random() in V8 verwendet xorshift128+ (einen schnellen Algorithmus mit geringer Entropie) und gibt eine 64-Bit-Gleitkommazahl in [0, 1) zurück; ein böswilliger Akteur, der einige Ausgaben beobachtet, kann prinzipiell den 128-Bit-Zustand rekonstruieren und jeden zukünftigen Wert vorhersagen. Dasselbe gilt für SpiderMonkey und JavaScriptCore. Das macht Math.random() ungeeignet für jeden Einsatz, bei dem das Ergebnis unvorhersehbar sein muss — faire Auswahl eines Gewinners, eines Tokens, eines Einmalpassworts, eines Kartenlegs oder einer Prüfstichprobe. crypto.getRandomValues(typedArray) ist die einzige Wahl dafür. Das Abbilden gleichverteilter 32-Bit-Ganzzahlen auf einen gleichverteilten Index in [0, N) ohne Modulo-Bias ist das zweite technische Detail, das korrekte von fehlerhafter Implementierung trennt. Naiv wäre idx = randomUint32 % N falsch: Wenn N kein Teiler von 2³² ist, sind die ersten 2³² mod N-Werte etwas wahrscheinlicher. Der korrekte Algorithmus ist Reject-Sampling: Berechne limit = 2³² - (2³² mod N); ziehe einen 32-Bit-Wert r; falls r >= limit, erneut ziehen; sonst r % N zurückgeben. Der Bias sinkt von O(N / 2³²) auf null. Für N = 2 oder N als Zweierpotenz ist der Modulo exakt, aber Reject-Sampling ist der sichere Standard und kostet im Durchschnitt höchstens eine erneute Ziehung (und terminiert immer). Der Picker speichert die Ergebnisse in localStorage mit einem versionierten Schlüssel, sodass eine Sitzung einen Seitenreload überlebt und der Nutzer den Ziehungsverlauf einsehen kann. Der Verlauf ist nicht verschlüsselt oder signiert — er ist lokal, nicht sicherheitskritisch und einfach zu löschen. Für den Modus ohne Wiederholung zieht der Algorithmus ohne Zurücklegen mittels eines partiellen Fisher-Yates-Shuffle: In Schritt k von N wird Element k mit einem gleichmäßig gewählten Element in [k, N) getauscht und Element k als gezogen gesperrt. Dies ist O(N)-Zeit, O(1) zusätzlicher Speicher und liefert jede Permutation mit gleicher Wahrscheinlichkeit, was die richtige kombinatorische Garantie ist. (Die naive Variante „N-mal ziehen, Wiederholungen verwerfen“ ist ebenfalls korrekt, aber O(N²) und kann bei langen Sitzungen stocken.) Für gewichtete Ziehungen (jede Option hat eigene Wahrscheinlichkeit) ist der Standardalgorithmus die inverse-CDF-Sampling mit einem Präfixsummen-Array: Erstelle eine Präfixsumme der Gewichte, ziehe eine gleichverteilte reelle Zahl in [0, total) und binär-suche nach dem kleinsten i mit prefix[i] >= u. Das ist O(log N) pro Ziehung, und die Präfixsumme wird einmalig pro Änderung aufgebaut. Die Alias-Methode (Walker-Vose) liefert O(1) pro Ziehung auf Kosten von O(N) Setup, was sich nur bei großem N und fester Verteilung lohnt.
- Zufallsquelle: crypto.getRandomValues(typedArray) — der einzige kryptografisch sichere RNG in Browsern, gestützt durch den CSPRNG des Betriebssystems (AES-256 CTR-DRBG auf Windows 10+, ChaCha20 auf Linux/macOS/iOS/Android).
- Math.random() ist xorshift128+ auf V8 (und Varianten auf anderen Engines): schnell, aber vorhersagbar. Niemals verwenden für faire Auswahl, Tokens, OTPs oder Prüfstichproben — nur für visuelles Rauschen, Animationen oder nicht-sicherheitsrelevante Stichproben.
- Unbiased-Index-Mapping: Reject-Sampling statt Modulo. Berechne limit = 2³² - (2³² mod N); falls der Zufalls-uint32 >= limit, erneut ziehen; sonst r % N zurückgeben. Vermeidet den klassischen „Modulo-Bias“, bei dem kurzrange Indizes häufiger auftreten.
- Ziehungen ohne Wiederholung verwenden partiellen Fisher-Yates-Shuffle in O(N)-Zeit, O(1)-Speicher: In Schritt k Element k mit einem gleichverteilten Element in [k, N) tauschen, dann k sperren. Jede Permutation ist gleichwahrscheinlich.
- Gewichtete Ziehungen verwenden inverse-CDF-Sampling: Präfixsumme der Gewichte einmal aufbauen, gleichverteilte reelle Zahl in [0, total) ziehen, binär nach dem kleinsten prefix[i] >= u suchen. O(log N) pro Ziehung.
- Ziehungsverlauf wird in localStorage mit einem versionierten Schlüssel gespeichert, sodass eine Sitzung einen Seitenreload überlebt. Der Verlauf ist nur lokal und nicht sicherheitskritisch — in der UI löschen, wenn fertig.
- Fisher-Yates vs. „N-mal mit Verwerfen ziehen“: Beide sind in der Verteilung korrekt, aber Fisher-Yates ist O(N) gesamt und O(1) Speicher, während naive Verwerfung im Worst Case O(N²) ist (viele Wiederholungen am Ende einer langen Liste).
- Ausgabebereich und Typen: getRandomValues akzeptiert Int8Array, Uint8Array, Int16Array, Uint16Array, Int32Array, Uint32Array, BigInt64Array, BigUint64Array — die Seite verwendet immer Uint32Array für den Index-Mapping-Schritt.
Beispiele
Ziehung ohne Wiederholung aus einer Kandidatenliste
Eingabeliste (eine pro Zeile):
Alice
Bob
Charlie
David
Eve
Frank
Duplikate erlauben: AUS Ziehungen: 3
Ergebnis:
#1: Charlie
#2: Alice
#3: Frank
(Bob, David, Eve verbleiben im Pool)
Die Seite ruft crypto.getRandomValues() auf einem Uint32Array auf, um
eine gleichverteilte Ganzzahl in [0, n) für jede Ziehung zu erzeugen, wobei n die Anzahl der
verbleibenden Kandidaten ist. Jeder Name hat bei jeder Ziehung dieselbe Wahrscheinlichkeit von 1/n,
und der gewählte Index steht fest, bevor die Animation beginnt.Ziehung mit Wiederholung und Zeitstempel-Verlauf
Eingabeliste (eine pro Zeile):
Kopf
Zahl
Duplikate erlauben: AN Ziehungen: 5
Ergebnis:
#1 (14:23:01): Kopf
#2 (14:23:01): Zahl
#3 (14:23:01): Kopf
#4 (14:23:01): Kopf
#5 (14:23:01): Zahl
Im Wiederholungsmodus kann derselbe Eintrag in aufeinanderfolgenden Ziehungen gezogen werden, und
der Pool schrumpft nie. Der Zeitstempel der Ziehung wird zu jedem Datensatz hinzugefügt, sodass
dieselbe Kandidatenliste über mehrere Runden hinweg wiederverwendet werden kann, während der Verlauf
genau zeigt, wann jede Ziehung erfolgte. Datensätze separat von
der Kandidatenliste löschen - sie werden unter verschiedenen localStorage-Schlüsseln gespeichert.JavaScript-Snippet für die zugrunde liegende Auswahl
// Wähle einen Index aus [0, n) mit Web Crypto (CSPRNG)
function pickIndex(n) {
// crypto.getRandomValues liefert einen gleichverteilten 32-Bit-Wert; Modulo n
// ist hier sicher, weil n bei einer Listen-Ziehung höchstens einige Tausend beträgt,
// und die Modulo-Verzerrung vernachlässigbar ist (2^32 / n ist groß).
const buf = new Uint32Array(1);
crypto.getRandomValues(buf);
return buf[0] % n;
}
// pickIndex(6) -> z. B. 4 (Charlie im Beispiel oben)
// pickIndex(2) -> 0 oder 1 (Kopf oder Zahl)
//
// Hinweis: Bei riesigen Pools, in denen n sich 2^32 nähert, verwende Rejection Sampling,
// um die Modulo-Verzerrung zu entfernen, z. B.:
// const limit = Math.floor(0xFFFFFFFF / n) * n;
// let r; do { crypto.getRandomValues(buf); r = buf[0]; } while (r >= limit);Fairness-Prüfung über 1.000 Ziehungen
Liste: ['A', 'B', 'C', 'D'] (4 Einträge, erwarteter Anteil 25,0 %)
Ziehungen: 1.000 Duplikate erlauben: AN
Beobachtet:
A: 247 (24,7 %)
B: 256 (25,6 %)
C: 248 (24,8 %)
D: 249 (24,9 %)
Ein Lauf mit 1.000 Ziehungen mit crypto.getRandomValues sollte bei jedem Eintrag innerhalb von etwa
+/- 3 Prozentpunkten des erwarteten Anteils landen; größere
Abweichungen (z. B. ein Eintrag bei 35 %) bedeuten meist, dass die Implementierung
Math.random() aufruft oder das Modulo falsch anwendet. Bei einer regulierten
Verlosung speichere die Quellenliste, die Quelle des Zufalls-Seeds (Browser-/OS-
Entropie), den Zeitstempel der Ziehung und eine Zeugensignatur - localStorage
ist kein dauerhaftes Aufzeichnungssystem.FAQ
Ist die Auswahl wirklich zufällig?
Ja. Die Auswahl nutzt crypto.getRandomValues aus der Web Crypto API, was kryptografisch sicher ist. Jede Option hat die gleiche Wahrscheinlichkeit, sofern du keine Gewichtungen einstellst.
Kann dieselbe Option zweimal hintereinander gezogen werden?
Ja – so funktioniert unabhängige Zufallsauswahl. Bei 5 Optionen liegt die Wahrscheinlichkeit für zwei gleiche Ziehungen hintereinander bei 1/5 = 20 %. Wenn du keine Wiederholungen willst, aktiviere „nach Auswahl entfernen“ – dann wird ohne Zurücklegen gezogen, bis die Liste leer ist.
Wie funktioniert „N Elemente ziehen“?
Standardmäßig wird ohne Zurücklegen gezogen – jedes Element kann pro N-Ziehung höchstens einmal ausgewählt werden. Aktiviere „mit Zurücklegen“, wenn Duplikate okay sind (z. B. N Aufgaben für eine Person ziehen). Im Modus ohne Zurücklegen darf N nicht größer als die Listenlänge sein.
Kann ich Gewichtungen hinzufügen, um die Ziehung zu beeinflussen?
Manche Builds unterstützen Gewichtungen pro Option (z. B. Option A Gewicht 3, Option B Gewicht 1 – A ist 3-mal wahrscheinlicher). Die Seite normalisiert Gewichte zu Wahrscheinlichkeiten. Ohne Gewichtungen hat jede Option die gleiche Wahrscheinlichkeit.
Warum ist das fairer als „aus dem Bauch heraus“ ziehen?
Menschen sind schlecht im Zufall – wir vermeiden tendenziell kürzlich Gewähltes, bevorzugen auffällige Optionen und tendieren unbewusst zu Namen, die wir kennen. Eine Computerziehung schaltet das aus, was Verlosungs-Entscheidungen für Beteiligte fairer wirken lässt.
Wird meine Liste gespeichert?
Manche Builds speichern in localStorage, sodass die Liste im selben Browser erhalten bleibt. Beim Schließen des Tabs oder Browserwechsel geht sie verloren, sofern du sie nicht exportiert hast. Es wird nichts hochgeladen.
Sollte ich es für offizielle Verlosungen nutzen?
Nein. Offizielle Verlosungen, Lotterien und Glücksspielziehungen erfordern prüfbare Zufallsverfahren, oft mit physischer oder zertifizierter RNG-Hardware. Ein allgemeines Web-Tool ist nicht dokumentiert oder auditiert – nutze es nur für Büro-Verlosungen und informelle Ziehungen.