Generieren von Zufallszahlen in Go
Wenhao Wang
Dev Intern · Leapcell

Key Takeaways
- Das
math/rand
-Paket bietet Pseudo-Zufallszahlengenerierung in Go. - Die Initialisierung mit
time.Now().UnixNano()
gewährleistet unterschiedliche Sequenzen bei verschiedenen Ausführungen. - Verwenden Sie
crypto/rand
für kryptografische Zufälligkeit anstelle vonmath/rand
.
Zufallszahlen sind in verschiedenen Programmierszenarien unerlässlich, z. B. in Simulationen, Spielen und Sicherheitsprotokollen. In Go bietet das math/rand
-Paket Funktionen zum Generieren von Pseudo-Zufallszahlen. Dieser Artikel untersucht, wie dieses Paket effektiv genutzt werden kann.
Importieren des math/rand
-Pakets
Importieren Sie zunächst die erforderlichen Pakete:
import ( "fmt" "math/rand" "time" )
Generieren von ganzzahligen Werten
Die Funktion rand.Intn
gibt eine nicht-negative Pseudo-Zufallszahl im Bereich [0, n)
zurück. Zum Beispiel:
fmt.Print(rand.Intn(100), ",") fmt.Print(rand.Intn(100)) fmt.Println()
Dieser Code erzeugt zwei Zufallszahlen zwischen 0 und 99.
Generieren von Gleitkommawerten
Für Gleitkommazahlen generiert rand.Float64
eine Pseudo-Zufallszahl im Bereich [0.0, 1.0)
:
fmt.Println(rand.Float64())
Um eine Gleitkommazahl innerhalb eines bestimmten Bereichs zu generieren, passen Sie die Ausgabe entsprechend an:
fmt.Print((rand.Float64()*5)+5, ",") fmt.Print((rand.Float64() * 5) + 5) fmt.Println()
Dieser Ausschnitt erzeugt Zahlen im Bereich [5.0, 10.0)
.
Initialisieren des Zufallszahlengenerators
Standardmäßig erzeugt der Zufallszahlengenerator von Go bei jeder Programmausführung die gleiche Zahlenfolge, da er einen deterministischen Startwert verwendet. Um sicherzustellen, dass bei verschiedenen Ausführungen unterschiedliche Sequenzen entstehen, geben Sie einen eindeutigen Startwert mit der aktuellen Zeit an:
s1 := rand.NewSource(time.Now().UnixNano()) r1 := rand.New(s1)
Die Verwendung von r1
führt nun bei jeder Ausführung zu unterschiedlichen Sequenzen:
fmt.Print(r1.Intn(100), ",") fmt.Print(r1.Intn(100)) fmt.Println()
Reproduzieren von Sequenzen mit festen Startwerten
Für Test- oder Debugging-Zwecke möchten Sie möglicherweise die gleiche Folge von Zufallszahlen reproduzieren. Dies kann durch die Verwendung eines festen Startwerts erreicht werden:
s2 := rand.NewSource(42) r2 := rand.New(s2) fmt.Print(r2.Intn(100), ",") fmt.Print(r2.Intn(100)) fmt.Println()
Die Verwendung desselben Startwerts (z. B. 42
) stellt sicher, dass r2
bei jeder Programmausführung dieselbe Sequenz erzeugt.
Hinweis zur kryptografischen Verwendung
Das math/rand
-Paket ist für allgemeine Zwecke geeignet, jedoch nicht für kryptografische Anwendungen. Für kryptografische Zufälligkeit sollten Sie das Paket crypto/rand
verwenden, das Funktionen wie rand.Read
zur Erzeugung sicherer Zufallsdaten bereitstellt.
Fazit
Das math/rand
-Paket in Go bietet unkomplizierte Methoden zum Generieren von Pseudo-Zufallszahlen. Durch das Verständnis, wie der Generator initialisiert und Zahlen innerhalb der gewünschten Bereiche erzeugt werden können, können Entwickler Zufälligkeit effektiv in ihre Anwendungen integrieren. Weitere Details und Beispiele finden Sie auf der Seite Go by Example: Random Numbers.
FAQs
Weil es einen deterministischen Startwert verwendet; verwenden Sie time.Now().UnixNano()
, um ihn zu randomisieren.
Verwenden Sie (rand.Float64() * 5) + 5
, um die Ausgabe zu skalieren.
Verwenden Sie crypto/rand
für sicherheitskritische Anwendungen, wie z. B. die Generierung von Passwörtern.
Wir sind Leapcell, Ihre erste Wahl für das Hosting von Go-Projekten.
Leapcell ist die Serverless-Plattform der nächsten Generation für Webhosting, asynchrone Aufgaben und Redis:
Multi-Sprachen-Unterstützung
- Entwickeln Sie mit Node.js, Python, Go oder Rust.
Stellen Sie unbegrenzt Projekte kostenlos bereit
- zahlen Sie nur für die Nutzung – keine Anfragen, keine Gebühren.
Unschlagbare Kosteneffizienz
- Pay-as-you-go ohne Leerlaufgebühren.
- Beispiel: 25 $ unterstützen 6,94 Millionen Anfragen bei einer durchschnittlichen Antwortzeit von 60 ms.
Optimierte Entwicklererfahrung
- Intuitive Benutzeroberfläche für mühelose Einrichtung.
- Vollautomatische CI/CD-Pipelines und GitOps-Integration.
- Echtzeitmetriken und -protokollierung für verwertbare Erkenntnisse.
Mühelose Skalierbarkeit und hohe Leistung
- Auto-Skalierung zur einfachen Bewältigung hoher Parallelität.
- Kein operativer Aufwand – konzentrieren Sie sich einfach auf den Aufbau.
Erfahren Sie mehr in der Dokumentation!
Folgen Sie uns auf X: @LeapcellHQ