Книга: Программирование на языке Ruby

8.1.10. Рандомизация массива

8.1.10. Рандомизация массива

Иногда нужно переставить элементы массива в случайном порядке. Первое, что приходит на ум, — тасование карточной колоды, но есть и другие применения — например, случайная сортировка списка вопросов.

Для решения этой задачи пригодится метод rand из модуля Kernel. Ниже показан один из возможных способов:

class Array
 def randomize
  self.sort_by { rand } # Сортировать по ключу, являющемуся
 end                    # случайным числом.
 def randomize!
  self.replace(self.randomize)
 end
end
x = [1, 2, 3, 4, 5]
y = x.randomize # [3, 2, 4, 1, 5]
x.randomize!    # x равно [3, 5, 4, 2]

Из-за самой природы сортировки, вероятно, вносится некоторое статистическое смещение. Но обычно это не играет роли.

Выбрать случайный элемент массива (не запрещая дубликатов) можно так:

class Array
 def pick_random
  self[rand(self.length)]
 end
end

Наконец, не стоит забывать, что метод rand позволяет сгенерировать предсказуемую последовательность (например, для тестирования), если затравить алгоритм известным значением с помощью метода srand (см. раздел 5.28).

Оглавление книги

Оглавление статьи/книги

Генерация: 1.336. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз