à des fins d'apprentissage, qu'est-ce que cela dit? L'objet est-il créé un tableau ou un hachage?
class Card attr_accessor :number, :suit, :value def initialize(number, suit, value) @number = number @suit = suit @value = value end def to_s "#{@number} of #{@suit}" end end
8 Réponses :
stack_of_cards.shuffle!
Mot? Il y a en fait une méthode de shuffle sur la classe de tableau? Jésus!
Cela ne modifie pas cependant le tableau. POUR VOTRE INFORMATION. : P Ne pas tenir compte, vous avez édité votre réponse ... I>
En regardant le changelog, #uffle semble avoir été ajouté le dernier jour d'août en 2006, ce qui aurait une première apparition, je pense, en 1.8.6. C'est certainement trop tard pour certaines éditions de divers livres de rubis.
Pour plus de plaisir, il y a une array.sample, qui retourne un élément aléatoire de votre réseau. Utilisez Array.Sample (3) si vous voulez 3 éléments aléatoires.
"C'est certainement trop tard pour certaines éditions de divers livres rubis". Très certainement. Ruby est l'une des cibles mobiles les plus rapides pour un éditeur semble-t-il. Je ne veux même pas parler de trouver de bons livres de rails car ils sont obsolètes quand ils sont publiés. :-)
en plus de Utilisation de la méthode shuffle , vous pouvez utiliser la méthode de tri: Ceci peut être utile si vous utilisez une ancienne version de Ruby où shuffle code> n'est pas implémenté. Comme avec
shuffle! Code>, vous pouvez utiliser
tri! Code> pour fonctionner sur le tableau existant. P> p>
Cela ne fonctionne pas bien. [1, 2, 3] .sort {rand.round} code> retourne toujours
[1, 2, 3] code> ou
[3, 2, 1] code>. La bonne façon doit être
[1, 2, 3] .sort {rand <=> rand} code> ou
[1, 2, 3] .sort_by {rand} code> ( Évitez si
shuffle code> peut être utilisé).
mentionner pour le hash aussi si vous savez ... en cas d'inconvénient
C'est un moyen vraiment inefficace de shuffer. Tri des algorithmes Ne comparez pas tous les éléments à chaque élément. Ils codent implicitement des inférences comme "si j'ai comparé A comme étant moins que B, et que B est inférieur à c, puis je peux déduire A est inférieur à c sans vérification." Le résultat est fortement i> asymétrique, comme décrit ici (en Objc, mais également applicable) cocoawithlove.com/2010/06/... Je vous demanderais de supprimer ou de modifier cette réponse
Si vous voulez mélanger un hachage, vous pouvez utiliser quelque chose comme ceci:
class Hash def shuffle Hash[self.to_a.sample(self.length)] end def shuffle! self.replace(self.shuffle) end end
Si vous vouliez devenir fou et écrivez votre propre méthode de shuffle de place, vous pouvez faire quelque chose comme ça.
Pourquoi rand (array.size-1) code> et non
rand (array.size) code>?
Rand code> n'est pas inclusif, donc par exemple
rand (5) code> des numéros de sortie de 0 à 4.
Ouais, il y avait en fait quelques problèmes avec ma mise en œuvre précédente. J'ai révisé ma méthode ci-dessus pour refléter l'algorithme de Knuth Shuffle. en.wikipedia.org/wiki/...
pour les tableaux: pour hachage: p>
Si vous voulez mélanger un hachage, mais vous ne voulez pas surcharger la classe Hash, vous pouvez utiliser la fonction de tri, puis le reconvertir à un hachage avec la fonction TO_H (Ruby 2.1 +):
a = {"a" => 1, "b" => 2, "c" => 3} puts a.inspect a = a.sort {|a, b| rand <=> rand }.to_h puts a.inspect
Une ancienne question, mais peut-être une aide pour quelqu'un d'autre. Je l'ai utilisé pour créer un jeu de cartes, c'est ce que @ davissp14 a écrit, il s'appelle "algorithme de pêcheurs-yates" maintenant, vous pouvez l'utiliser comme: p> https://dev.to/linuxander/ Fisher-Yates-shuffle-with-ruby-1p7h p> p>
pour un tableau: p>
pour un hachage: p>
array.shuffle code> p>
hash.sort_by {rand ()} code> p>
Je peux imaginer que vous avez sauté la structure, mais quand vous avez le temps, regardez-le.