這篇文章主要介紹python隨機(jī)漫步是什么,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
創(chuàng)新互聯(lián)專(zhuān)注于企業(yè)營(yíng)銷(xiāo)型網(wǎng)站建設(shè)、網(wǎng)站重做改版、滎陽(yáng)網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5建站、商城開(kāi)發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)公司、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性?xún)r(jià)比高,為滎陽(yáng)等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。
隨機(jī)漫步
這次我們將使用python生成隨機(jī)漫步數(shù)據(jù),然后用matplotlib的方式將這些數(shù)據(jù)呈現(xiàn)出來(lái)。
隨機(jī)漫步每次行走都完全是隨機(jī)的,沒(méi)有明確的方向,結(jié)果是由一系列隨機(jī)決策決定的。你可以這樣認(rèn)為,隨機(jī)漫步就是螞蟻在暈頭轉(zhuǎn)向的情況下,每次都沿隨機(jī)的方向所經(jīng)過(guò)的路徑。
創(chuàng)建RandomWalk()類(lèi)
為了模擬隨機(jī)漫步,我們創(chuàng)建一個(gè)RandownWalk的類(lèi),它隨機(jī)選擇前進(jìn)的方向。這個(gè)類(lèi)需要三個(gè)屬性,其中一個(gè)是存儲(chǔ)隨機(jī)漫步次數(shù)的變量,其他兩個(gè)是列表,分別存儲(chǔ)隨機(jī)漫步經(jīng)過(guò)的每個(gè)點(diǎn)的x坐標(biāo)和y坐標(biāo)。
RandomWalk類(lèi)只包含兩個(gè)方法,init()和fill_walk(),其中后者計(jì)算隨機(jī)漫步經(jīng)過(guò)的所有點(diǎn),下面是__init__()
:
from random import choiceclass RandomWalk(): """一個(gè)生成隨機(jī)漫步數(shù)據(jù)的類(lèi)""" def __init__(self, number_points=5000): """初始化隨機(jī)漫步的屬性""" self.number_points = number_points # 所有隨機(jī)漫步都始于(0,0) self.x_values = [0] self.y_values = [0]
為做出隨機(jī)決策,我們將所有可能的選擇都存儲(chǔ)到一個(gè)列表中,并在每次做出決策時(shí)都使用choice()來(lái)決定使用哪種選擇,然后我們將隨機(jī)漫步的默認(rèn)點(diǎn)數(shù)設(shè)置為5000,然后我們創(chuàng)建了兩個(gè)用于存儲(chǔ)x值和y值的列表,并讓每次漫步都是從(0,0)開(kāi)始出發(fā)。
選擇方向
def fill_walk(self): """計(jì)算隨機(jī)漫步中包含的所有點(diǎn)""" # 不斷漫步,直到列表達(dá)到指定的長(zhǎng)度 while len(self.x_values) < self.number_points: # 決定前進(jìn)方向以及沿這個(gè)方向前進(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 # 計(jì)算下一個(gè)點(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)
我們建立了一個(gè)循環(huán),這個(gè)循環(huán)不斷進(jìn)行,直到漫步包含所有需數(shù)量的點(diǎn)。這個(gè)方法的主要部分告訴python如何模擬四種漫步?jīng)Q定:向左走還是向右走?向上走還是向下走?沿著指定的方向走多遠(yuǎn)?
我們使用choice([1, -1])給x_direction選擇一個(gè)值,結(jié)果要么是表示向右走的1,要么是表示向左走的-1,接下來(lái)choice([0, 1, 2, 3, 4])隨機(jī)選擇一個(gè)0~4之間的數(shù),告訴python沿著指定方向走多遠(yuǎn)。
我們將移動(dòng)方向乘以移動(dòng)距離,以確定沿x軸和y軸移動(dòng)的距離。如果x_step為正,就將向右移動(dòng),為負(fù)向左移動(dòng),而為0將垂直移動(dòng),y_step為正向上移動(dòng),為負(fù)向下移動(dòng),為0則水平移動(dòng),如果兩個(gè)都為0那么就以為著在原地踏步,我們拒絕這種情況,接著執(zhí)行下一次循環(huán)。
為獲取隨機(jī)漫步的下一個(gè)點(diǎn)的x值,我們將x_step和x_values的最后一個(gè)值相加,對(duì)于y值也做同樣的處理。獲得下一個(gè)點(diǎn)的x值和y值之后,我們將它分別附加到列表x_values和y_values的末尾。
繪制隨機(jī)漫步圖
我們將上面創(chuàng)建RandomWalk類(lèi)的py文件命名為random_walk.py。
下面的代碼將隨機(jī)漫步的所有點(diǎn)都繪制出來(lái):
import matplotlib.pyplot as pltfrom random_walk import RandomWalk# 創(chuàng)建一個(gè)RandWalk實(shí)例,并將其包含的點(diǎn)都繪制出來(lái)rw = RandomWalk(5000)rw.fill_walk()plt.scatter(rw.x_values, rw.y_values, s=15)plt.show()
我們首先導(dǎo)入了模塊pyplot和RandomWalk類(lèi),然后創(chuàng)建了一個(gè)RandomWalk實(shí)例,并將其存儲(chǔ)到rw中,再調(diào)用fill_walk(),下圖就是顯示了包含了5000個(gè)點(diǎn)的隨機(jī)漫步圖。
模擬多次隨機(jī)漫步
每次隨機(jī)漫步都不相同,因此探索可能生成的各種模式很有趣。在不多次運(yùn)行程序的情況下使用前面的代碼模擬多次隨機(jī)漫步,一種辦法就是將前面的代碼放進(jìn)一個(gè)while循環(huán)中,如下所示:
import matplotlib.pyplot as pltfrom random_walk import RandomWalkwhile True: # 創(chuàng)建一個(gè)RandWalk實(shí)例,并將其包含的點(diǎn)都繪制出來(lái) rw = RandomWalk(5000) rw.fill_walk() plt.scatter(rw.x_values, rw.y_values, s=1) plt.show() keep_running = input('Make another walk? (y/n) : ') if keep_running == 'n': break
這些代碼模擬一次隨機(jī)漫步,如果你輸入y則再繼續(xù)模擬生成一次隨機(jī)漫步,輸入n的話就退出程序了。
給點(diǎn)著色
我們將使用顏色映射出漫步中個(gè)點(diǎn)的先后順序,并刪除各個(gè)點(diǎn)的黑色輪廓,讓他們顏色更加明顯。為根據(jù)漫步中各點(diǎn)的先后順序進(jìn)行著色,我們傳遞參數(shù)c,并設(shè)置一個(gè)列表,其中包含各點(diǎn)的先后順序。由于這些點(diǎn)都是按順序繪制的,因此參數(shù)c指定的列表只需包含數(shù)字1~5000即可。如下所示:
import matplotlib.pyplot as pltfrom random_walk import RandomWalkwhile True: # 創(chuàng)建一個(gè)RandWalk實(shí)例,并將其包含的點(diǎn)都繪制出來(lái) rw = RandomWalk(5000) rw.fill_walk() point_numbers = list(range(rw.number_points)) plt.scatter(rw.x_values, rw.y_values, c=point_numbers, cmap=plt.cm.Blues, edgecolors='none', s=1) plt.show() keep_running = input('Make another walk? (y/n) : ') if keep_running == 'n': break
我們使用range生成了一個(gè)數(shù)字列表,其中包含的數(shù)字與漫步包含的點(diǎn)數(shù)相同。接下來(lái),我們將這個(gè)列表存儲(chǔ)到point_numbers中,以方便使用它設(shè)置每個(gè)漫步點(diǎn)的顏色。我們將每個(gè)參數(shù)c設(shè)置為point_numbers,指定顏色映射為藍(lán)色,并傳遞實(shí)參edgecolors以刪除每個(gè)點(diǎn)周?chē)妮喞W罱K的隨機(jī)漫步圖由淺藍(lán)色漸變?yōu)樯钏{(lán)色。如下圖所示:
重新繪制起點(diǎn)和終點(diǎn)
除了給隨機(jī)漫步各個(gè)點(diǎn)著色,以指出他們的先后順序外,如果還能呈現(xiàn)隨機(jī)漫步的終點(diǎn)和起點(diǎn)就更好了。為此,可在繪制隨機(jī)漫步圖后重新繪制隨機(jī)漫步的起點(diǎn)和終點(diǎn)。我們讓起點(diǎn)和終點(diǎn)變得更大,并顯示為不同的顏色,以突出它們,如下所示:
import matplotlib.pyplot as pltfrom random_walk import RandomWalkwhile True: # 創(chuàng)建一個(gè)RandWalk實(shí)例,并將其包含的點(diǎn)都繪制出來(lái) rw = RandomWalk(5000) rw.fill_walk() point_numbers = list(range(rw.number_points)) plt.scatter(rw.x_values, rw.y_values, c=point_numbers, cmap=plt.cm.Blues, edgecolors='none', s=1) # 突出起點(diǎn)和終點(diǎn) plt.scatter(0, 0, c='green', edgecolors='none', s=100) plt.scatter(rw.x_values[-1], rw.y_values[-1], c='red', edgecolors='none', s=100) plt.show() keep_running = input('Make another walk? (y/n) : ') if keep_running == 'n': break
為突出起點(diǎn),我們使用綠色繪制點(diǎn)(0,0),并使其比其它點(diǎn)大。為突出終點(diǎn),我們?cè)诼桨淖詈笠粋€(gè)x值和y值處繪制一個(gè)點(diǎn),使其為紅色,并比其它點(diǎn)大。運(yùn)行代碼,將準(zhǔn)確知道每次隨機(jī)漫步的起點(diǎn)和終點(diǎn)。
隱藏坐標(biāo)軸
下面來(lái)隱藏坐標(biāo)軸,以免我們注意點(diǎn)是坐標(biāo)軸而不是隨機(jī)漫步路徑。要隱藏坐標(biāo)做代碼如下:
# 隱藏坐標(biāo)軸plt.axes().get_xaxis().set_visible(False)plt.axes().get_yaxis().set_visible(False)
為修改坐標(biāo)軸,使用函數(shù)plt.axes()來(lái)將每條坐標(biāo)軸的可見(jiàn)性設(shè)置為False。圖如下:
以上是“python隨機(jī)漫步是什么”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!