616 votes

Comment puis-je choisir au hasard dans un tableau ?

Je veux savoir s'il existe un moyen beaucoup plus propre de faire cela. Fondamentalement, je veux choisir un élément aléatoire dans un tableau de longueur variable. Normalement, je le ferais comme ceci :

myArray = ["stuff", "widget", "ruby", "goodies", "java", "emerald", "etc" ]
item = myArray[rand(myarray.length)]

Y a-t-il quelque chose de plus lisible / plus simple pour remplacer la deuxième ligne ? Ou est-ce la meilleure façon de le faire. Je suppose que vous pourriez faire myArray.shuffle.first, mais je n'ai vu #shuffle que depuis quelques minutes sur SO, je ne l'ai pas encore utilisé.

13 votes

Bonne réponse ci-dessous mais un point général à propos du mélange. Je suppose que mélanger le tableau complet serait beaucoup plus intensif que de simplement obtenir un nombre aléatoire, donc ce ne serait pas une bonne direction à prendre.

1226voto

Marc-André Lafortune Points 34140

Il suffit d'utiliser Array#sample :

[:foo, :bar].sample # => :foo, ou :bar :-)

Cela est disponible dans Ruby 1.9.1+. Pour pouvoir l'utiliser également avec une version antérieure de Ruby, vous pourriez require "backports/1.9.1/array/sample".

Remarquez que dans Ruby 1.8.7, cette méthode existe sous le nom malheureux choice; elle a été renommée dans les versions ultérieures, donc vous ne devriez pas l'utiliser.

Bien que pas utile dans ce cas, sample accepte un argument numérique au cas où vous voudriez plusieurs échantillons distincts.

1 votes

Je aurais dû savoir que vous auriez une réponse parfaite pour moi (puisque la plupart des questions Ruby que je parcours ici ont votre contribution quelque part). Je suis content que vous ayez souligné la version; j'utilise la 1.9.2. apidock (commentaire de mladen) n'a pas d'exemple; ni ne le fait ruby-doc. À votre avis, quelle est la meilleure référence pour Ruby, mise à jour à 1.9?

0 votes

D'ailleurs, est-il correct de changer la "bonne réponse" après avoir d'abord sélectionné une autre réponse?

1 votes

Merci :-) Et oui, c'est encouragé (voir meta.stackexchange.com/questions/19448/…).

96voto

user2528177 Points 172

myArray.sample(x) peut également vous aider à obtenir x éléments aléatoires du tableau.

8 votes

Il convient de noter que my_array.sample(1) != my_array.sample

7 votes

@Redithion Il est également important de noter que la différence entre: my_array.sample(1) == [sample] et my_array.sample == sample pour expliciter ce que vous voulez dire

0 votes

Formidable, c'est exactement ce que je cherchais.

18voto

user2904252 Points 21
myArray.sample

retournera 1 valeur aléatoire.

myArray.shuffle.first

retournera également 1 valeur aléatoire.

28 votes

Le mélange est superflu.

1 votes

Techniquement, cette méthode aléatoire est également correcte stackoverflow.com/a/84747/2047418

17voto

Michael Rapadas Points 560

Nombre aléatoire d'éléments aléatoires d'un tableau

def random_items(array)
  array.sample(1 + rand(array.count))
end

Exemples de résultats possibles:

my_array = ["un", "deux", "trois"]
my_array.sample(1 + rand(my_array.count))

=> ["deux", "trois"]
=> ["un", "trois", "deux"]
=> ["deux"]

0 votes

@fwilson collections aléatoires d'objets dans n'importe quel ordre. Aussi bon pour tester différentes combinaisons ou générer des données fictives

0 votes

Pourquoi ne pas étendre la classe Array ? [].total_random serait bien plus cool. Allez, c'est du Ruby. C'est objectif !

0 votes

Cela ne renverrait jamais un tableau vide. Vous devez placer 1 + à un endroit différent.

5voto

grddev Points 1740

Personnellement, je préférerais la méthode item = myArray.random_element. MISE À JOUR : Avant Ruby 1.8.7, vous deviez définir la méthode vous-même. Consultez la réponse de Marc-André Lafortune pour une vision plus moderne.

class Array
  def random_element
    self[rand(length)]
  end
end

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X