Книга «Изучаем Python»



Pdf көрінісі
бет170/238
Дата07.01.2022
өлшемі7,86 Mb.
#18670
түріКнига
1   ...   166   167   168   169   170   171   172   173   ...   238
Байланысты:
2 5343781172763690906

УПРАЖНЕНИЯ

15-1 . Кубы: число, возведенное в третью степень, называется «кубом» . Нанесите на диа-

грамму первые пять кубов, а затем первые 5000 кубов .

15-2 . Цветные кубы: примените цветовую карту к диаграмме с кубами .

Случайное блуждание

В этом разделе мы используем Python для генерирования данных для случайного 

обхода, а затем при помощи 

matplotlib

 создадим привлекательное представление 

сгенерированных данных. Случайным блужданием (random walk) называется путь, 

который не имеет четкого направления, но определяется серией полностью случай-

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

в случайном направлении; его путь напоминает случайное блуждание.

Случайное блуждание находит практическое применение в естественных науках: 

физике, биологии, химии и экономике. Например, пыльцевое зерно на поверх-

ности водяной капли движется по поверхности воды, потому что его постоянно 

подталкивают молекулы воды. Молекулярное движение в капле воды случайно, 



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()


322    Глава 15  •  Генерирование данных

Сначала программа импортирует 

pyplot

 и 


RandomWalk

. Затем она создает случайное 

блуждание и сохраняет его в 

rw

 , не забывая вызвать 



fill_walk()

. В точке  про-

грамма передает 

scatter()

 координаты 

x

 и 



y

 блуждания и выбирает подходящий 

размер точки.

На рис. 15.8 показана диаграмма с 5000 точками. (В изображениях этого раз-

дела область просмотра 

matplotlib

 не показана, но вы увидите ее при запуске 

rw_visual .py

.)



Достарыңызбен бөлісу:
1   ...   166   167   168   169   170   171   172   173   ...   238




©emirsaba.org 2024
әкімшілігінің қараңыз

    Басты бет