Ich möchte meine Array-Elemente verschlüsselt haben. Etwas wie folgt aus:Wie sortiere ich ein Array in Ruby?
[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]
und so weiter, zufällig
Ich möchte meine Array-Elemente verschlüsselt haben. Etwas wie folgt aus:Wie sortiere ich ein Array in Ruby?
[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]
und so weiter, zufällig
in jetzt errichtet:
[1,2,3,4].shuffle => [2, 1, 3, 4]
[1,2,3,4].shuffle => [1, 3, 2, 4]
für Ruby 1.8.6 (was nicht shuffle in nicht gebaut):
array.sort_by { rand }
@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
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. –
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' ...
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
-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
Und wenn Sie es umsetzen wollen selbst. Http://en.wikipedia.org/wiki/Fisher-Yates_shuffle – Joey
Oder wenn Sie es für Ruby wollen <1.9 : erfordern 'Backports' –
Sieht aus wie es in Ruby 1.8.7 ist auch. –