Книга: Программирование на языке 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).
- 8.1.1. Создание и инициализация массива
- 8.1.2. Доступ к элементам массива и присваивание им значений
- 8.1.3. Определение размера массива
- 8.1.4. Сравнение массивов
- 8.1.5. Сортировка массива
- 8.1.6. Выборка из массива по заданному критерию
- 8.1.7. Специализированные функции индексирования
- 8.1.8. Реализация разреженной матрицы
- 8.1.9. Массивы как математические множества
- 8.1.10. Рандомизация массива
- 8.1.11. Многомерные массивы
- 8.1.12. Нахождение элементов, принадлежащих одному массиву и не принадлежащих другому
- 8.1.13. Преобразование или отображение массивов
- 8.1.14. Удаление из массива элементов равных nil
- 8.1.15. Удаление заданных элементов из массива
- 8.1.16. Конкатенирование массивов и добавление в конец массива
- 8.1.17. Использование массива в качестве стека или очереди
- 8.1.18. Обход массива
- 8.1.19. Преобразование массива в строку с разделителями
- 8.1.20. Обращение массива
- 8.1.21. Удаление дубликатов из массива
- 8.1.22. Чередование массивов
- 8.1.23. Вычисление частоты различных значений в массиве
- 8.1.24. Инвертирование массива для получения хэша
- 8.1.25. Синхронная сортировка нескольких массивов
- 8.1.26. Указание значения по умолчанию для новых элементов массива
- 8.1.3. Определение размера массива
- 8.1.21. Удаление дубликатов из массива
- 8.1.26. Указание значения по умолчанию для новых элементов массива
- 8.1.17. Использование массива в качестве стека или очереди
- 8.1.14. Удаление из массива элементов равных nil
- 8.1.20. Обращение массива
- 8.1.19. Преобразование массива в строку с разделителями
- Новые функции API для работы с Blob и массивами
- 9.2 Реализация массива ftAID на платформе Windows NT
- 7.6. Обход элементов массива
- 14.4.2. Хранение переменных окружения в виде массива или хэша
- Работа с массивами в хранимых процедурах