隨機(jī)漫步
在本節(jié)中胆绊,我們將使用python來生成隨機(jī)漫步數(shù)據(jù)
再使用matplotlib呈現(xiàn)數(shù)據(jù)
隨機(jī)漫步:
每次行走都是完全隨機(jī)的辑舷,沒有明確方向槽片,結(jié)果是由一系列隨機(jī)決策決定的
1.創(chuàng)建RandomWalk()類
為模擬隨機(jī)漫步肢础,我們將創(chuàng)建一個名為RandomWalk的類,它隨機(jī)地選擇前進(jìn)方向
這個類需要三個屬性剩盒,其中一個是存儲隨機(jī)漫步次數(shù)的變量慨蛙,其他兩個是列表
分別存儲隨機(jī)漫步經(jīng)過的每個點(diǎn)的x和y坐標(biāo)
RandomWalk類只包含兩個方法:__init__()
和fill_walk()
其中后者計算隨機(jī)漫步經(jīng)過的所有點(diǎn)期贫,下面先來看__init__()
創(chuàng)建random_walk.py文件
from random import choice
class RandomWalk():
"""一個生成隨機(jī)漫步數(shù)據(jù)的類"""
def __init__(self,num_points=5000):
"""初始化隨機(jī)漫步的屬性"""
self.num_points = num_points
#所有隨機(jī)漫步都始于(0,0)
self.x_values = [0]
self.y_values = [0]
為做出隨機(jī)決策,我們將所有可能的選擇都存儲在一個列表中
并在每次做決策時都使用choice()來決定使用哪種選擇
接下來玛臂,我們將隨機(jī)漫步包含的默認(rèn)點(diǎn)數(shù)設(shè)置為5000
然后,創(chuàng)建兩個用于存儲x和y值的列表讽营,并讓每次漫步都從點(diǎn)(0,0)出發(fā)
2.選擇方向
我們將使用fill_walk()來生成漫步包含的點(diǎn)泡徙,并決定每次漫步的方向
def fill_walk(self):
"""計算隨機(jī)漫步包含的所有點(diǎn)"""
#不斷漫步堪藐,直到列表達(dá)到指定的長度
while len(self.x_values) < self.num_points:
#決定前進(jìn)方向以及沿這個方向前進(jìn)的距離
x_direction = choice([1,-1])
x_distance = choice([0,1,2,3,4])
x_step = x_direction*x_distance
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
#計算下一個點(diǎn)的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)
首先建立一個循環(huán),循環(huán)不斷運(yùn)行指導(dǎo)漫步包含所需數(shù)量的點(diǎn)
這個方法主要是告訴python如何模擬四種漫步?jīng)Q定:
向右還是向左走贮勃,沿指定方向走多遠(yuǎn)苏章,向上還是向下走枫绅,沿指定方向走多遠(yuǎn)
我們使用choice([1,-1])給x_direction選擇一個值
結(jié)果要么是表示向右走的1,要么是表示向左走的-1
接下來choice([0,1,2,3,4])隨機(jī)選擇一個0~4之間的整數(shù)
告訴python沿指定方向走多遠(yuǎn)(x_distance)
通過包含0寓搬,我們不僅能夠沿x軸移動县耽,還能夠沿y軸移動
我們將移動方向乘以移動距離,以確定x和y軸移動的距離
如果x_step為正兔毙,將向右移動澎剥,為負(fù)將向左移動,而為零將垂直移動
如果y_step為正祭饭,將向上移動叙量,為負(fù)將向下移動,而為零將水平移動
如果x_step和y_step都為零悠咱,則意味著原地踏步,將跳過并執(zhí)行下一次循環(huán)
為了獲取漫步中下一個點(diǎn)的x值躬贡,我們將x_step與x_values中的最后一個值相加
對于y值也做相同的處理眼坏,獲得下一個點(diǎn)的x和y值后,將它們分別附加到列表
x_values和y_values的末尾
3.繪制隨機(jī)漫步圖
下面的代碼將隨機(jī)漫步的所有點(diǎn)都繪制出來:
import matplotlib.pyplot as plt
from random_walk import RandomWalk
#創(chuàng)建一個RandomWalk實(shí)例檐蚜,并將其包含的點(diǎn)都繪制出來
rw = RandomWalk()
rw.fill_walk()
plt.scatter(rw.x_values,rw.y_values,s=5)
plt.show()
我們首先導(dǎo)入了模塊pyplot和RandomWalk類,然后創(chuàng)建了一個RandomWalk實(shí)例
并將其存儲到rw中沿侈,再調(diào)用fill_walk()
將隨機(jī)漫步包含的x和y值傳遞給scatter()闯第,并選擇了合適的點(diǎn)尺寸
如圖:
4.模擬多次隨機(jī)漫步
每次隨機(jī)漫步都不同,因此探索可能生成的各種模式很有趣
要在不多次運(yùn)行程序的情況下使用前面的代碼模擬多次隨機(jī)漫步
一種辦法是將這些代碼放進(jìn)一個while循環(huán)里缀拭,如下:
import matplotlib.pyplot as plt
from random_walk import RandomWalk
while True:
#創(chuàng)建一個RandomWalk實(shí)例咳短,并將其包含的點(diǎn)都繪制出來
rw = RandomWalk()
rw.fill_walk()
plt.scatter(rw.x_values,rw.y_values,s=5)
plt.show()
keep_running = input('Make another walk? (y/n):')
if keep_running == 'n':
break
這些代碼模擬一次隨機(jī)漫步,在matplotlib查看器中顯示結(jié)果
再在不關(guān)閉查看器的情況下暫停蛛淋,如果關(guān)閉查看器
程序?qū)⒃儐柺欠褚倌M一次隨機(jī)漫步咙好,輸入y
可再進(jìn)行一次隨機(jī)漫步
結(jié)束程序,輸入n