Go:
Zufallszahlen generieren
Wie geht das:
In Go werden Zufallszahlen mit dem math/rand
Paket für Pseudo-Zufallszahlen oder crypto/rand
für kryptographisch sichere Pseudo-Zufallszahlen generiert. Lassen Sie uns beide erkunden.
Verwendung von math/rand
für Pseudo-Zufallszahlen
Zuerst importieren Sie das math/rand
Paket und das time
Paket, um den Generator zu initialisieren. Das Initialisieren stellt sicher, dass Sie bei jedem Lauf eine andere Zahlenfolge erhalten.
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
rand.Seed(time.Now().UnixNano())
fmt.Println("Eine zufällige Zahl:", rand.Intn(100)) // Generiert eine Zahl zwischen 0 und 99
}
Beispielausgabe: Eine zufällige Zahl: 42
Verwendung von crypto/rand
für kryptographisch sichere Pseudo-Zufallszahlen
Für sicherheitssensitivere Anwendungen eignet sich das crypto/rand
Paket, da es Zufallszahlen generiert, die schwer vorherzusagen sind, was sie für kryptographische Operationen geeignet macht.
package main
import (
"crypto/rand"
"fmt"
"math/big"
)
func main() {
n, _ := rand.Int(rand.Reader, big.NewInt(100))
fmt.Println("Eine sichere zufällige Zahl:", n)
}
Beispielausgabe: Eine sichere zufällige Zahl: 81
Vertiefung
Der Kernunterschied zwischen den Paketen math/rand
und crypto/rand
in Go ergibt sich aus ihrer Quelle der Entropie und ihren vorgesehenen Anwendungsfällen. math/rand
generiert Pseudo-Zufallszahlen basierend auf einem anfänglichen Seed; daher ist die Sequenz deterministisch und kann vorhergesagt werden, wenn der Seed bekannt ist. Das ist geeignet für Szenarien, bei denen hohe Leistung und nicht absolute Unvorhersehbarkeit das Hauptanliegen ist, wie bei Simulationen oder Spielen.
Auf der anderen Seite leitet crypto/rand
Zufälligkeit vom zugrunde liegenden Betriebssystem ab, was es für kryptografische Anwendungen geeignet macht, bei denen Unvorhersehbarkeit entscheidend ist. Dies geht jedoch auf Kosten der Leistung und Komplexität bei der Handhabung der generierten Zahlen (wie das Umgehen mit dem Typ *big.Int
für Ganzzahlen).
Historisch gesehen hat die Vorstellung der Erzeugung von Zufallszahlen in Computern immer am Rand der wahren “Zufälligkeit” getanzt, wobei frühe Systeme stark von deterministischen Algorithmen abhängig waren, die Zufälligkeit nachahmten. Mit der Evolution der Computer entwickelten sich auch diese Algorithmen weiter und integrierten ausgefeiltere Quellen der Entropie aus ihrer Umgebung.
Trotz dieser Fortschritte ist die Suche nach perfekter Zufälligkeit in der Informatik an sich paradox, angesichts der deterministischen Natur von Computern selbst. Deshalb sind für die meisten Anwendungen, bei denen Vorhersehbarkeit schädlich wäre, kryptographisch sichere Pseudo-Zufallszahlen aus Quellen wie crypto/rand
die bessere Alternative, trotz ihres Mehraufwands.
Im Wesentlichen geht Go mit zwei verschiedenen Paketen für die Generierung von Zufallszahlen elegant auf den Kompromiss zwischen Leistung und Sicherheit ein und ermöglicht Entwicklern die Wahl basierend auf ihren spezifischen Bedürfnissen.