Tôi muốn có các mục mảng của tôi được xáo trộn. Một cái gì đó như thế này:
[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]
và cứ thế, ngẫu nhiên
Tôi muốn có các mục mảng của tôi được xáo trộn. Một cái gì đó như thế này:
[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]
và cứ thế, ngẫu nhiên
Câu trả lời:
Được xây dựng ngay bây giờ:
[1,2,3,4].shuffle => [2, 1, 3, 4]
[1,2,3,4].shuffle => [1, 3, 2, 4]
!
sau cuộc gọi để xáo trộn. Không có !
mảng xáo trộn được trả về, và chín muồi cho một nhiệm vụ.
Đối với ruby 1.8.6 (không có shuffle tích hợp):
array.sort_by { rand }
sort_by
chức năng của ruby không hoạt động như chức năng sắp xếp của javascript (hoặc chức năng sắp xếp của ruby cho vấn đề đó), chỉ quan tâm xem số được tính có nhỏ hơn 0, 0 hay lớn hơn không. Thay vào đó sort_by
hãy nhớ giá trị tính toán cho từng mục và sau đó sắp xếp các mục theo giá trị đó. Vì vậy, trong trường hợp này, mỗi mục được gán một số ngẫu nhiên và sau đó mảng được sắp xếp theo các số ngẫu nhiên đó.
Mã từ Đá quý Backports chỉ cho Mảng cho Ruby 1.8.6. Ruby 1.8.7 trở lên được tích hợp sẵn.
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
Các của Ruby khía cạnh thư viện các phần mở rộng có một Random
mô-đun cung cấp phương pháp hữu ích bao gồm shuffle
và shuffle!
để một loạt các lớp lõi bao gồm Array
, Hash
và String
.
Hãy cẩn thận nếu bạn đang sử dụng Rails vì tôi đã trải qua một số cuộc đụng độ khó chịu theo cách mà trò bịp bợm của nó đụng độ với ...