2009-11-29 26 views

Respuesta

252

construido en ahora:

[1,2,3,4].shuffle => [2, 1, 3, 4] 
[1,2,3,4].shuffle => [1, 3, 2, 4] 
+3

Y si quieres implementarla uno mismo:. Http://en.wikipedia.org/wiki/Fisher-Yates_shuffle – Joey

+0

O si lo desea para Ruby <1,9 : requiere 'backports' –

+1

Parece que también está en Ruby 1.8.7. –

24

para Ruby 1.8.6 (que no se han incorporado en la reproducción aleatoria):

array.sort_by { rand } 
+11

@Josh: la página a la que vinculó describe un algoritmo completamente diferente. Tenga en cuenta que la función 'sort_by' 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 se preocupa si el número calculado es menor que cero, cero o mayor que cero. En cambio, 'sort_by' recuerda el valor calculado para cada elemento y luego ordena los elementos por ese valor. Entonces, en este caso, a cada elemento se le asigna un número aleatorio y luego la matriz se ordena por esos números aleatorios. – sepp2k

+0

Con una matriz de gran tamaño, este tipo de números aleatorios para cada elemento puede llevar demasiado tiempo (O (NLogN), podríamos hacerlo en un tiempo lineal si generamos un número aleatorio a partir de los elementos anteriores que hemos barajado y luego intercambiamos como el incremento del iterador –

0

La biblioteca de extensiones Ruby Facets tiene un módulo Random que h proporciona métodos útiles que incluyen shuffle y shuffle! a un grupo de clases principales que incluyen Array, Hash y String.

Sólo tenga cuidado si usted está utilizando rieles que he tenido algunos enfrentamientos desagradables en el camino de su monkeypatching se enfrentaron con rieles ...

9

para Ruby 1.8.6 como ejemplo de sepp2k, pero aún quiere utilizar " shuffle "método.

class Array 
    def shuffle 
    sort_by { rand } 
    end 
end 

[1,2,3,4].shuffle #=> [2,4,3,1] 
[1,2,3,4].shuffle #=> [4,2,1,3] 

aplausos

2

código de la Backports Gem por sólo la matriz para Ruby 1.8.6. Ruby 1.8.7 o superior está construida en

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