Saya ingin item array saya diacak. Sesuatu seperti ini:
[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]
dan seterusnya, secara acak
Saya ingin item array saya diacak. Sesuatu seperti ini:
[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]
dan seterusnya, secara acak
Jawaban:
Dibangun sekarang:
[1,2,3,4].shuffle => [2, 1, 3, 4]
[1,2,3,4].shuffle => [1, 3, 2, 4]
!
setelah panggilan untuk mengacak. Tanpa !
array shuffled dikembalikan, dan matang untuk tugas.
Untuk ruby 1.8.6 (yang tidak memiliki shuffle bawaan):
array.sort_by { rand }
sort_by
fungsi ruby tidak berfungsi seperti fungsi sortir javascript (atau fungsi sortir ruby dalam hal ini), yang hanya peduli apakah angka yang dihitung kurang dari nol, nol atau lebih besar dari nol. Alih-alih sort_by
mengingat nilai yang dihitung untuk setiap item dan kemudian mengurutkan item dengan nilai itu. Jadi dalam hal ini setiap item diberi nomor acak dan kemudian array diurutkan berdasarkan angka-angka acak itu.
Kode dari Gem Backports hanya untuk Array untuk Ruby 1.8.6. Ruby 1.8.7 atau lebih tinggi sudah ada di dalamnya.
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
The Ruby Aspek perpustakaan ekstensi memiliki Random
modul yang menyediakan metode yang berguna termasuk shuffle
dan shuffle!
untuk sekelompok kelas inti termasuk Array
, Hash
dan String
.
Berhati-hatilah jika Anda menggunakan Rails karena saya mengalami beberapa bentrokan yang tidak menyenangkan dalam cara monkeypatchingnya berbenturan dengan Rails ...