Ruby'de bir dizi rastgele nasıl sıralanır (karıştırılır)?


128

Dizi öğelerimin karıştırılmasını istiyorum. Bunun gibi bir şey:

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

ve benzeri, rastgele

Yanıtlar:


293

Şimdi yerleşik:

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

3
Ve kendiniz uygulamak istiyorsanız: en.wikipedia.org/wiki/Fisher-Yates_shuffle
Joey

Veya Ruby <1.9 için istiyorsanız: 'backports' gerektir
Marc-André Lafortune

1
Ruby 1.8.7'de gibi görünüyor.
Brian Armstrong

Bu tamamen harika.
sidney

1
Sadece eklemek istedim: Koleksiyonu etkilemek istiyorsanız !, karıştırma çağrısından sonra bir ekleyin . !Karıştırılmış dizi olmadan döndürülür ve bir atama için olgunlaşır.
Muyiwa Olu

27

Ruby 1.8.6 için (yerleşik karıştırma özelliği olmayan):

array.sort_by { rand }

11
@Josh: Bağlandığınız sayfa tamamen farklı bir algoritmayı açıklıyor. Ruby'nin sort_byişlevinin, yalnızca hesaplanan sayının sıfırdan küçük, sıfır veya sıfırdan büyük olmasına önem veren javascript'in sıralama işlevi (veya bu konuda Ruby'nin sıralama işlevi) gibi çalışmadığını unutmayın . Bunun yerine sort_by, her öğe için hesaplanan değeri hatırlar ve ardından öğeleri bu değere göre sıralar. Yani bu durumda her öğeye rastgele bir sayı atanır ve ardından dizi bu rastgele sayılara göre sıralanır.
sepp2k

Büyük boyutlu bir diziyle, her öğe için rastgele sayılara göre bu sıralama çok uzun sürebilir (O ​​(NLogN), karıştırdığımız önceki öğelerden rastgele bir sayı oluşturursak bunu doğrusal bir süre içinde yapabiliriz ve ardından yineleme artışı.
Downhillski

9

Ruby 1.8.6 için sepp2k örneğinde olduğu gibi, ancak yine de "shuffle" yöntemini kullanmak istiyorsunuz.

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]

şerefe


2

Sadece Ruby 1.8.6 Dizisi için Backports Geminden kod . Ruby 1.8.7 veya üstü yerleşiktir.

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

0

Yakut YÖNÜ uzantıların kütüphane bulunur Randomdahil olmak üzere faydalı yöntemler sağlar modülü shuffleve shuffle!da dahil olmak üzere çekirdek sınıfların bir grup Array, Hashve String.

Sadece Rails kullanıyorsanız dikkatli olun, çünkü maymun ekiminin Rails ile çakıştığı şekilde bazı kötü çatışmalar yaşadım ...

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.