Me gustaría mezclar mis elementos de la matriz. Algo como esto:
[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]
y así sucesivamente, al azar
Me gustaría mezclar mis elementos de la matriz. Algo como esto:
[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]
y así sucesivamente, al azar
Respuestas:
Construido ahora:
[1,2,3,4].shuffle => [2, 1, 3, 4]
[1,2,3,4].shuffle => [1, 3, 2, 4]
!
después de la llamada para barajar. Sin el, !
la matriz aleatoria se devuelve, y madura para una asignación.
Para ruby 1.8.6 (que no tiene shuffle incorporado):
array.sort_by { rand }
sort_by
función de ruby no funciona como la función de clasificación de javascript (o la función de clasificación de ruby para el caso), que solo le importa si el número calculado es menor que cero, cero o mayor que cero. En su lugar, sort_by
recuerda el valor calculado para cada elemento y luego ordena los elementos por ese valor. En este caso, a cada elemento se le asigna un número aleatorio y luego la matriz se ordena por esos números aleatorios.
Código de Backports Gem solo para Array for Ruby 1.8.6. Ruby 1.8.7 o superior está integrado.
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 biblioteca de extensiones Ruby Facets tiene un Random
módulo que proporciona métodos útiles que incluyen shuffle
y shuffle!
para un grupo de clases principales que incluyen Array
, Hash
y String
.
Solo tenga cuidado si está usando Rails, ya que experimenté algunos desagradables enfrentamientos en la forma en que su parche chocó con el de Rails ...