shuffle tableau en Aller
J'ai essayé de traduire le code Python suivant pour Aller
import random
list = [i for i in range(1, 25)]
random.shuffle(list)
print(list)
mais trouvé mon Go version longue et difficile car il n'existe pas de fonction de lecture aléatoire et j'ai dû mettre en place des interfaces et de convertir des types.
Ce qui serait une idiomatiques Go version de mon code?
- Cette question a un shuffle() mise en œuvre: Traitement de Tableaux en Aller.
Vous devez vous connecter pour publier un commentaire.
Que votre liste est juste les entiers de 1 à 25, vous pouvez utiliser Perm :
Noter que l'utilisation d'une permutation donnée par
rand.Perm
est un moyen efficace de mélanger n'importe quel tableau.dystroy réponse est parfaitement raisonnable, mais il est également possible de mélanger sans allocation supplémentaire tranches.
Voir cet article de Wikipédia pour plus de détails sur l'algorithme.
rand.Perm
utilise cet algorithme à l'interne ainsi.i!=j
vérifier?Depuis 1.10 Go est équipé d'un fonctionnaire Shuffle de Fisher-Yates fonction.
Documentation:
pkg/math/rand/#Shuffle
Voir aussi à l'origine CL 51891
Exemple:
Réponse par Evan Shaw a un bug mineur. Si nous parcourir la tranche d'index la plus faible à la plus élevée, afin d'obtenir un uniforme (pseudo) aléatoire shuffle, selon le même l'article, nous devons choisir un entier aléatoire dans l'intervalle
[i,n)
par opposition à[0,n+1)
.Que la mise en œuvre permettra de faire ce que vous avez besoin pour les grandes entrées, mais pour les plus petites tranches, il va effectuer une non-uniforme shuffle.
À utiliser
rand.Intn()
, nous pouvons faire:suivant le même algorithme à partir de l'article de Wikipedia.
Peut-être que vous pouvez également utiliser la fonction suivante:
Lors de l'utilisation de la
math/rand
paquet, ne pas oublier de mettre une sourceJ'ai donc écrit un
Shuffle
fonction qui prend cela en considération:Et de l'utiliser:
Si vous souhaitez l'utiliser, vous pouvez le trouver ici https://github.com/shomali11/util
Raed l'approche de est très rigide en raison de
[]interface{}
comme entrée. Ici, c'est plus pratique version pour aller>=1.8:Exemple d'utilisation:
Et aussi, n'oubliez pas que un peu de la copie est de mieux qu'une petite dépendance
Utilisation Shuffle() de la
math/rand
bibliothèque.Voici un exemple:
Puisqu'il vient de la
math/rand
bibliothèque, il doit être ensemencées. Voir ici pour plus de détails.