320
Глава 15 • Генерирование данных
поэтому путь пыльцевого зерна на поверхности представляет собой случайное
блуждание. Код, который мы напишем, найдет применение при моделировании
многих реальных ситуаций.
Создание класса RandomWalk()
Чтобы создать путь случайного блуждания, мы создадим класс
RandomWalk
, кото-
рый принимает случайные решения по выбору направления. Классу нужны три
атрибута: переменная для хранения количества точек в пути и два списка для
координат
x
и
y
каждой точки.
Класс
RandomWalk
содержит всего два метода:
__init__()
и
fill_walk()
для вычис-
ления точек случайного блуждания.
Начнем с метода
__init__()
:
random_walk.py
from random import choice
class RandomWalk():
"""Класс для генерирования случайных блужданий."""
def __init__(self, num_points=5000):
"""Инициализирует атрибуты блуждания."""
self.num_points = num_points
# Все блуждания начинаются с точки (0, 0).
self.x_values = [0]
self.y_values = [0]
Чтобы принимать случайные решения, мы сохраним возможные варианты в списке
и используем функцию
choice()
для принятия решения
. Затем для списка уста-
навливается количество точек по умолчанию равным 5000 — достаточно большим,
чтобы генерировать интересные закономерности, но достаточно малым, чтобы
блуждания генерировались быстро
. Затем в точке
создаются два списка для
хранения
значений
x
и
y
, после чего каждый путь начинается с точки (0, 0).
Выбор направления
Метод
fill_walk()
, как показано ниже, заполняет путь точками и определяет на-
правление каждого шага.
Добавьте этот метод в
random_walk .py
:
random_walk.py
def fill_walk(self):
"""Вычисляет все точки блуждания."""
# Шаги генерируются до достижения нужной длины.
while len(self.x_values) < self.num_points:
# Определение направления и длины перемещения.
x_direction = choice([1, -1])
x_distance = choice([0, 1, 2, 3, 4])
x_step = x_direction * x_distance
Случайное блуждание
321
y_direction = choice([1, -1])
y_distance = choice([0, 1, 2, 3, 4])
y_step = y_direction * y_distance
# Отклонение нулевых перемещений.
if x_step == 0 and y_step == 0:
continue
# Вычисление следующих значений x и y.
next_x = self.x_values[-1] + x_step
next_y = self.y_values[-1] + y_step
self.x_values.append(next_x)
self.y_values.append(next_y)
В точке
запускается цикл, который выполняется вплоть до заполнения пути
правильным количеством точек. Главная часть этого метода сообщает Python, как
следует моделировать четыре случайных решения: двигаться ли вправо или влево?
Как далеко идти в этом направлении? Двигаться ли вверх или вниз? Как далеко
идти в этом направлении?
Выражение
choice([1,
-1])
выбирает значение
x_direction
; оно возвращает 1 для
перемещения вправо или –1 для движения влево
. Затем выражение
choice([0,
1,
2,
3,
4])
определяет дальность перемещения в этом направлении (
x_distance
)
случайным выбором целого числа от 0 до 4. (Включение 0 позволяет выполнять
шаги по
оси
y
, а также шаги со смещением по обеим осям.)
В точках
и
определяется длина каждого шага в направлениях
x
и
y
, для чего
направление движения умножается на выбранное расстояние. При положительном
результате
x_step
смещает вправо, при отрицательном — влево, при нулевом —
вертикально. При положительном результате
y_step
смещает вверх, при отрица-
тельном — вниз, при нулевом — горизонтально. Если оба значения
x_step
и
y_step
равны 0, то блуждание останавливается, но
цикл продолжается
.
Чтобы получить следующее значение
x
, мы прибавляем значение
x_step
к по-
следнему значению, хранящемуся в
x_values
, и делаем то же самое для значе-
ний
y
. После того как значения будут получены, они присоединяются к
x_values
и
y_values
.
Вывод случайного блуждания
Ниже приведен код отображения всех точек блуждания:
rw_visual.py
import matplotlib.pyplot as plt
from random_walk
import RandomWalk
# Построение случайного блуждания и нанесение точек на диаграмму.
rw = RandomWalk()
rw.fill_walk()
plt.scatter(rw.x_values, rw.y_values, s=15)
plt.show()