Hoe een array willekeurig sorteren (scrambelen) in Ruby?

Ik wil graag dat mijn array-items worden versleuteld.
Zoiets als dit:

[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]

en zo verder, willekeurig


Antwoord 1, autoriteit 100%

Nu ingebouwd:

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

Antwoord 2, autoriteit 9%

Voor ruby ​​1.8.6 (die geen shuffle ingebouwd heeft):

array.sort_by { rand }

Antwoord 3, autoriteit 3%

Voor ruby ​​1.8.6 zoals sepp2k’s voorbeeld, maar je wilt toch de “shuffle”-methode gebruiken.

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]

proost


Antwoord 4

Code van de Backports Gemvoor alleen de Array voor Ruby 1.8.6. Ruby 1.8.7 of hoger is ingebouwd.

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

Antwoord 5

De Ruby Facetsbibliotheek met extensies heeft een Randommodule die handige methoden biedt, waaronder shuffleen shuffle!naar een aantal kernklassen, waaronder Array, Hashen String.

Wees voorzichtig als je Rails gebruikt, want ik heb vervelende botsingen gehad met de manier waarop de monkeypatching botste met Rails’…

Other episodes