2009-11-29 19 views

Antwort

252

in jetzt errichtet:

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

Und wenn Sie es umsetzen wollen selbst. Http://en.wikipedia.org/wiki/Fisher-Yates_shuffle – Joey

+0

Oder wenn Sie es für Ruby wollen <1.9 : erfordern 'Backports' –

+1

Sieht aus wie es in Ruby 1.8.7 ist auch. –

24

für Ruby 1.8.6 (was nicht shuffle in nicht gebaut):

array.sort_by { rand } 
+11

@Josh: Die verlinkte Seite beschreibt einen völlig anderen Algorithmus. Beachten Sie, dass die Funktion "sort_by" von Ruby nicht wie die Sortierfunktion von JavaScript funktioniert (oder die Sortierfunktion von Ruby), die nur interessiert, ob die berechnete Zahl kleiner als null, null oder größer als null ist. Stattdessen speichert 'sort_by' den berechneten Wert für jedes Element und sortiert dann die Elemente nach diesem Wert. In diesem Fall wird jedem Element eine Zufallszahl zugewiesen und dann wird das Array nach diesen Zufallszahlen sortiert. – sepp2k

+0

Bei einem großen Array könnte diese Sortierung nach den Zufallszahlen für jedes Element zu lange dauern (O (NLogN), wir könnten es in einer linearen Zeit tun, wenn wir eine Zufallszahl aus den vorherigen Elementen, die wir gemischt haben, erzeugen und dann austauschen das Iterator-Inkrement. –

0

Die Erweiterungsbibliothek Ruby Facets verfügt über ein Modul Random, das sich in der Liste befindet h liefert nützliche Methoden einschließlich shuffle und shuffle! zu einer Reihe von Kernklassen einschließlich Array, Hash und String.

Nur vorsichtig sein, wenn Sie mit Rails, wie ich einige bösen Auseinandersetzungen in der Art und Weise seine monkeypatching kollidierte mit Rails' ...

9

für Ruby 1.8.6 als sepp2k das Beispiel erlebt, aber Sie wollen immer noch verwenden " shuffle "Methode.

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] 

prost

2

-Code aus dem Backports Gem nur für das Array für Ruby 1.8.6. Ruby 1.8.7 oder höher gebaut in

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