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
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
Odpowiedzi:
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):
array.sort_by { rand }
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 tego sort_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.
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
Ruby Facets biblioteki rozszerzeń posiada Random
moduł, który dostarcza użytecznych metod w tym shuffle
i shuffle!
do kilka podstawowych klas włącznie Array
, Hash
i String
.
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 '...