Generierung von zufälligen ganzen Zahlen in JavaScript: präziser Bereich im Jahr 2025

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Zufallszahlen in JavaScript: Vom Chaos zur Ordnung

\n

Stellen Sie sich vor: Sie schreiben ein Spiel, bei dem zufällig eine Schatztruhe von 1 bis 100 ausgewählt werden soll. Oder vielleicht erstellen Sie einen A/B-Test, der eine zufällige Variante für den Benutzer auswählt. Es scheint einfach, oder? Aber der Teufel steckt, wie immer, im Detail. Die Frage nach der Generierung von zufälligen ganzen Zahlen in JavaScript in einem bestimmten Bereich ist eine der beliebtesten auf Stack Overflow, und das aus gutem Grund. Selbst erfahrene Entwickler stolpern manchmal über die Fallstricke von Math.random().

\n

In diesem Artikel behandeln wir nicht nur die klassischen Methoden, sondern auch die Best Practices des Jahres 2025: Wie man den Code nicht nur funktionsfähig, sondern auch sicher, vorhersehbar (im guten Sinne) und leistungsfähig macht. Los geht's!

\n\n

Der Klassiker: Math.random() und seine Fallstricke

\n

Beginnen wir mit den Grundlagen. Die eingebaute Funktion Math.random() gibt eine pseudozufällige Gleitkommazahl im Bereich [0, 1) zurück. Der entscheidende Punkt: 0 ist eingeschlossen, 1 jedoch nicht. Dies ist eine "unfaire" Verteilung, wenn Sie ganze Zahlen erhalten möchten.

\n

Hier ist die häufigste (und falscheste) Methode, die oft in alten Lehrbüchern zu finden ist:

\n
// SCHLECHTES Beispiel: Wahrscheinlichkeitsverschiebung\nfunction getRandomBad(min, max) {\n  return Math.floor(Math.random() * (max - min + 1)) + min;\n}\n
\n

Auf den ersten Blick scheint alles richtig zu sein. Aber schauen wir genauer hin. Math.floor() rundet ab. Wenn Math.random() eine Zahl sehr nahe an 1 (aber nicht gleich) generiert, ergibt die Multiplikation mit (max - min + 1) einen Wert kleiner als max + 1, und Math.floor() schneidet ihn ab. Aufgrund der begrenzten Genauigkeit von Gleitkommazahlen (IEEE 754) treten jedoch einige Werte seltener auf als andere. Für den Bereich 0-1 ist dies nicht wahrnehmbar, aber für große Bereiche (z. B. von 1 bis 1.000.000) wird die Verschiebung statistisch signifikant.

\n

Fazit: Diese Formel funktioniert für kleine Bereiche, ist aber nicht "kryptografisch sauber" und kann zu einer Verteilungsverzerrung führen.

\n\n

Die korrekte Formel von MDN

\n

Mozilla Developer Network (MDN) empfiehlt einen korrekteren Ansatz, der Rundungsfehler minimiert:

\n
// Gute, universelle Methode\nfunction getRandomIntInclusive(min, max) {\n  const minCeiled = Math.ceil(min);\n  const maxFloored = Math.floor(max);\n  return Math.floor(Math.random() * (maxFloored - minCeiled + 1) + minCeiled);\n}\n
\n

Der Unterschied besteht darin, dass wir die Grenzen explizit mit Math.ceil() und Math.floor() in ganze Zahlen umwandeln. Dies stellt sicher, dass min und max korrekt verarbeitet werden, selbst wenn Sie versehentlich eine Dezimalzahl übergeben. Verwenden Sie diese Methode als grundlegenden Standard im Jahr 2025.

\n\n

Alternativen: Wenn Math.random() nicht ausreicht

\n

Der klassische Math.random() ist ein Pseudozufallszahlengenerator (PRNG). Er ist deterministisch: Wenn Sie den Startwert (Seed) kennen, können Sie die gesamte Sequenz vorhersagen. Für die meisten Webanwendungen (Animationen, zufällige Inhalte) ist dies ausreichend. Es gibt jedoch Szenarien, in denen echte Zufälligkeit erforderlich ist:

\n
    \n
  • Sicherheit: Generierung von Tokens, Passwörtern, CSRF-Tokens.
  • \n
  • Kryptografie: Datenverschlüsselung auf dem Client.
  • \n
  • Glücksspiele: Faire Verteilung von Gewinnen.
  • \n
\n

In diesen Fällen hilft crypto.getRandomValues() – ein kryptografisch sicherer Generator (CSPRNG). Er nutzt systemische Entropiequellen und ist weitaus weniger vorhersagbar.

\n\n

Generierung ganzer Zahlen mit crypto.getRandomValues()

\n

So sieht eine moderne Implementierung für 2025 aus:

\n
// Sichere Generierung einer zufälligen ganzen Zahl im Bereich [min, max]\nfunction getSecureRandomInt(min, max) {\n  const range = max - min + 1;\n  // Maximaler Wert, der ein Vielfaches von range ist (um Verzerrungen zu vermeiden)                

Blogs

Buchempfehlungen