Мені б хотілося, щоб мої елементи масиву були зашифровані. Щось на зразок цього:
[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]
і так далі, випадковим чином
Мені б хотілося, щоб мої елементи масиву були зашифровані. Щось на зразок цього:
[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]
і так далі, випадковим чином
Відповіді:
Вбудовано зараз:
[1,2,3,4].shuffle => [2, 1, 3, 4]
[1,2,3,4].shuffle => [1, 3, 2, 4]
!
після виклику перетасовування. Без !
перетасованого масиву повертається і дозріває для призначення.
Для рубіну 1.8.6 (у якому немає вбудованого перемикання):
array.sort_by { rand }
sort_by
функція ruby не працює як функція сортування javascript (або функція сортування ruby для цього питання), яка переймається лише тим, чи є обчислене число менше нуля, нуля або більше нуля. Натомість sort_by
запам'ятовує обчислене значення для кожного елемента, а потім сортує елементи за цим значенням. Тож у цьому випадку кожному елементу присвоюється випадкове число, а потім масив сортується за тими випадковими числами.
Код з Backports Gem для просто масиву для Ruby 1.8.6. Вбудований Ruby 1.8.7 або вище.
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
Рубін Грань бібліотека розширень має Random
модуль , який містить корисні методи , включаючи shuffle
і shuffle!
до зв'язки основних класів , включаючи Array
, Hash
і String
.
Будьте обережні, якщо ви використовуєте Rails, коли я пережив неприємні сутички в тому, як його маніпулювання зіткнулося з "Рейлами" ...