10
votes

Comment puis-je mélanger un tableau / hachage dans Ruby?

à 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


1 commentaires

Je peux imaginer que vous avez sauté la structure, mais quand vous avez le temps, regardez-le.


8 Réponses :


21
votes
stack_of_cards.shuffle!

5 commentaires

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 ...


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. :-)



1
votes

en plus de Utilisation de la méthode shuffle , vous pouvez utiliser la méthode de tri: xxx

Ceci peut être utile si vous utilisez une ancienne version de Ruby où shuffle n'est pas implémenté. Comme avec shuffle! , vous pouvez utiliser tri! pour fonctionner sur le tableau existant.


3 commentaires

Cela ne fonctionne pas bien. [1, 2, 3] .sort {rand.round} retourne toujours [1, 2, 3] ou [3, 2, 1] . La bonne façon doit être [1, 2, 3] .sort {rand <=> rand} ou [1, 2, 3] .sort_by {rand} ( Évitez si shuffle 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 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



12
votes

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


0 commentaires

1
votes

Si vous vouliez devenir fou et écrivez votre propre méthode de shuffle de place, vous pouvez faire quelque chose comme ça. xxx


2 commentaires

Pourquoi rand (array.size-1) et non rand (array.size) ? Rand n'est pas inclusif, donc par exemple rand (5) 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/...



1
votes

pour les tableaux: xxx

pour hachage: xxx


0 commentaires

0
votes

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


0 commentaires

1
votes

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" xxx

maintenant, vous pouvez l'utiliser comme: xxx < / Pre>

https://dev.to/linuxander/ Fisher-Yates-shuffle-with-ruby-1p7h


0 commentaires

0
votes

pour un tableau:

array.shuffle

pour un hachage:

hash.sort_by {rand ()}


0 commentaires