J'aimerais que mes éléments de tableau soient brouillés. Quelque chose comme ça:
[1,2,3,4].scramble => [2,1,3,4]
[1,2,3,4].scramble => [3,1,2,4]
[1,2,3,4].scramble => [4,2,3,1]
et ainsi de suite, au hasard
J'aimerais que mes éléments de tableau soient brouillés. Quelque chose comme ça:
[1,2,3,4].scramble => [2,1,3,4]
[1,2,3,4].scramble => [3,1,2,4]
[1,2,3,4].scramble => [4,2,3,1]
et ainsi de suite, au hasard
Réponses:
Construit maintenant:
[1,2,3,4].shuffle => [2, 1, 3, 4]
[1,2,3,4].shuffle => [1, 3, 2, 4]
!
après l'appel à la lecture aléatoire. Sans le, !
le tableau mélangé est retourné et mûr pour une affectation.
Pour ruby 1.8.6 (qui n'a pas de shuffle intégré):
array.sort_by { rand }
sort_by
fonction de ruby ne fonctionne pas comme la fonction de tri de javascript (ou la fonction de tri de ruby d'ailleurs), qui se soucie uniquement de savoir si le nombre calculé est inférieur à zéro, zéro ou supérieur à zéro. Au lieu sort_by
de cela, il se souvient de la valeur calculée pour chaque élément, puis trie les éléments par cette valeur. Donc, dans ce cas, chaque élément se voit attribuer un nombre aléatoire, puis le tableau est trié par ces nombres aléatoires.
Code de la gemme Backports uniquement pour le tableau pour Ruby 1.8.6. Ruby 1.8.7 ou supérieur est intégré.
class Array
# Standard in Ruby 1.8.7+. See official documentation[http://ruby-doc.org/core-1.9/classes/Array.html]
def shuffle
dup.shuffle!
end unless method_defined? :shuffle
# Standard in Ruby 1.8.7+. See official documentation[http://ruby-doc.org/core-1.9/classes/Array.html]
def shuffle!
size.times do |i|
r = i + Kernel.rand(size - i)
self[i], self[r] = self[r], self[i]
end
self
end unless method_defined? :shuffle!
end
La bibliothèque d'extensions Ruby Facets a un Random
module qui fournit des méthodes utiles, y compris shuffle
et shuffle!
à un tas de classes de base, y compris Array
, Hash
et String
.
Faites juste attention si vous utilisez Rails car j'ai vécu des affrontements désagréables dans la façon dont son monkeypatching s'est heurté à Rails '...