Seit 1.10 beinhaltet Go eine offizielle Fisher-Yates Shuffle Funktion.
Dokumentation: pkg/math/rand/#Shuffle
math / rand: Shuffle hinzufügen
Shuffle verwendet den Fisher-Yates-Algorithmus.
Da es sich um eine neue API handelt, haben wir die Möglichkeit, eine viel schnellere Int31n
Implementierung zu verwenden, bei der eine Teilung größtenteils vermieden wird.
Infolgedessen BenchmarkPerm30ViaShuffle
ist es etwa 30% schneller als BenchmarkPerm30
, obwohl eine separate Initialisierungsschleife erforderlich ist und Funktionsaufrufe zum Austauschen von Elementen verwendet werden.
Siehe auch das Original CL 51891
Erstens, wie von shelll kommentiert :
Vergessen Sie nicht, den Zufall zu setzen, sonst erhalten Sie immer die gleiche Reihenfolge.
Zum Beispielrand.Seed(time.Now().UnixNano()
Beispiel:
words := strings.Fields("ink runs from the corners of my mouth")
rand.Shuffle(len(words), func(i, j int) {
words[i], words[j] = words[j], words[i]
})
fmt.Println(words)