Depuis la version 1.10, Go inclut une version officielle de Le remaniement Fisher-Yates fonction.
Documentation : pkg/math/rand/#Shuffle
math/rand : ajouter Shuffle
Shuffle utilise l'algorithme de Fisher-Yates.
Puisqu'il s'agit d'une nouvelle API, elle nous donne l'occasion de d'utiliser une Int31n
qui évite la plupart du temps la division.
En conséquence, BenchmarkPerm30ViaShuffle
est environ 30 % plus rapide que BenchmarkPerm30
, bien que nécessitant une boucle d'initialisation séparée et en utilisant des appels de fonction pour échanger des éléments.
Voir aussi l'original CL 51891
Premièrement, comme a commenté por shelll :
N'oubliez pas d'ensemencer le hasard, sinon vous obtiendrez toujours le même ordre.
Par exemple rand.Seed(time.Now().UnixNano())
Exemple :
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)