Chciałbym, aby moje elementy tablicy zostały zaszyfrowane. Coś takiego:
[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]
i tak dalej, losowo
Wbudowany teraz:
[1,2,3,4].shuffle => [2, 1, 3, 4]
[1,2,3,4].shuffle => [1, 3, 2, 4]
!
po wywołaniu tasowania. Bez!
shuffled tablica jest zwracana i gotowa do przypisania.Dla Ruby 1.8.6 (który nie ma wbudowanego tasowania):
źródło
sort_by
funkcja ruby'ego nie działa jak funkcja sortowania javascript (lub funkcja sortowania ruby'ego), która dba tylko o to, czy obliczona liczba jest mniejsza od zera, zero czy większa od zera. Zamiast tegosort_by
zapamiętuje obliczoną wartość dla każdego elementu, a następnie sortuje elementy według tej wartości. W tym przypadku każdy element ma przypisaną liczbę losową, a następnie tablica jest sortowana według tych liczb losowych.Dla ruby 1.8.6 jak na przykładzie sepp2k, ale nadal chcesz użyć metody "shuffle".
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]
Twoje zdrowie
źródło
Kod z klejnotu Backports tylko dla tablicy dla Ruby 1.8.6. Wbudowany Ruby 1.8.7 lub nowszy.
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
źródło
Ruby Facets biblioteki rozszerzeń posiada
Random
moduł, który dostarcza użytecznych metod w tymshuffle
ishuffle!
do kilka podstawowych klas włącznieArray
,Hash
iString
.Po prostu bądź ostrożny, jeśli używasz Railsów, ponieważ doświadczyłem paskudnych starć w sposobie, w jaki jego monkeypatch zderzył się z Railsami '...
źródło