Python實(shí)現(xiàn)隨機(jī)漫步的詳細(xì)過(guò)程
本篇博客將使用 Python 來(lái) 生成隨機(jī)漫步數(shù)據(jù),再使用 Matplotlib 庫(kù),將以引人注目的方式將這些數(shù)據(jù)呈現(xiàn)出來(lái)。
隨機(jī)漫步 顧名思義就是隨機(jī)走出的步伐,它是這樣行走得到的路徑:每次行走都是完全隨機(jī)的、沒(méi)有明確的方向,結(jié)果是由一系列隨機(jī)決策決定的。我們可以將隨機(jī)漫步看作是 螞蟻在暈頭轉(zhuǎn)向 的情況下,每次都沿隨機(jī)的方向前行所經(jīng)過(guò)的路徑。
1. 創(chuàng)建 RandomWalk 類
為模擬隨機(jī)漫步,首先創(chuàng)建一個(gè)名為 RandomWalk 的類,其作用是 隨機(jī)的選擇前進(jìn)方向。這個(gè)類需要三個(gè)屬性:一個(gè)是 存儲(chǔ)隨機(jī)漫步次數(shù)的變量,其他兩個(gè)是 列表,分別存儲(chǔ)隨機(jī)漫步經(jīng)過(guò)的每個(gè)點(diǎn)的 x 坐標(biāo) 和 y 坐標(biāo)。
RandomWalk 類只包含兩個(gè)方法:
- 方法 __init__ () ,初始化屬性
- 方法 fill_walk () ,計(jì)算隨機(jī)漫步經(jīng)過(guò)的所有點(diǎn)
from random import choice class RandomWalk: '''一個(gè)生成隨機(jī)漫步數(shù)據(jù)的類''' def __init__(self, num_points = 500): '''初始化隨機(jī)漫步的屬性''' self.num_points = num_points # 所有隨機(jī)漫步都使于(0,0) self.x_values = [0] self.y_values = [0]
- 為做出 隨機(jī)決策,將 所有可能的選擇 都存儲(chǔ)在一個(gè)列表中,并在每次決策時(shí),都使用模塊 random 中的 choice () 來(lái)決定使用哪種選擇 。
- 將隨機(jī)漫步包含的默認(rèn)點(diǎn)數(shù)設(shè)置為 5000,這個(gè)數(shù)大到 足以生成有趣的模式,又小到可確保能夠 快速地模擬隨機(jī)漫步。
- 創(chuàng)建兩個(gè)用于存儲(chǔ) x 值和 y 值的列表,并讓每次漫步都從 點(diǎn)(0,0)出發(fā)。
2. 選擇方向
我們將使用方法 fill_walk() 來(lái)生成 漫步包含的點(diǎn),并 決定每次漫步的方向。
import random def fill_walk(self): '''計(jì)算隨機(jī)漫步包含的所有點(diǎn)''' # 不斷漫步,直到列表達(dá)到指定的長(zhǎng)度 while len(self.x_values) < self.num_points: # 決定前進(jìn)方向以及沿這個(gè)方向前進(jìn)的距離 x_direction = random.choice([1,-1]) x_distance = random.choice([0,1,2,3,4]) x_step = x_direction * x_distance y_direction = random.choice([1,-1]) y_distance = random.choice([0,1,2,3,4]) y_step = y_direction * y_distance # 拒絕原地踏步 if x_step == 0 and y_step == 0: continue # 計(jì)算下一個(gè)點(diǎn)的 x 值和 y 的值 x = self.x_values[-1] + x_step y = self.y_values[-1] + y_step self.x_values.append(x) self.y_values.append(y)
- 先建立一個(gè)循環(huán),它不斷運(yùn)行,直到漫步包含所需的點(diǎn)數(shù)。方法 fill_walk()的主要部分告訴 Python 如何模擬四種漫步?jīng)Q定:向右走還是向左走?沿指定的方向走多遠(yuǎn)?向上走還是向下走?沿指定的方向走多遠(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)(x_distance)。通過(guò)包含 0 ,不僅能夠同時(shí)沿兩個(gè)軸移動(dòng),還能夠只沿一個(gè)軸移動(dòng)。
- 將 移動(dòng)方向乘以移動(dòng)距離,確定沿 x 軸和 y 軸移動(dòng)的距離。如果 x_step 為正將向右移動(dòng),為負(fù)將向左移動(dòng),為零將垂直移動(dòng);如果 y_step 為正將向上移動(dòng),為負(fù)將向下移動(dòng),為零將水平移動(dòng)。如果 x_step 和 y_step 都為零,則意味著原地踏步。我們拒絕這樣的情況,接著執(zhí)行下一次循環(huán)。
- 為獲取漫步中下一個(gè)點(diǎn)的 x 的值,將 x_step 和 x_values 中的最后一個(gè)值相加,對(duì) y 值也做相同的處理。獲得下一個(gè)點(diǎn)的 x 值和 y 值后,將它們分別附件到列表 x_values 和 y_values 的末尾。
3. 繪制隨機(jī)漫步圖
下面的代碼將隨機(jī)漫步的所有點(diǎn)都繪制出來(lái):
from random import choice import matplotlib.pyplot as plt class RandomWalk: '''一個(gè)生成隨機(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] def fill_walk(self): '''計(jì)算隨機(jī)漫步包含所有的點(diǎn)''' # 不斷漫步,直到列表達(dá)到指定的長(zhǎng)度 while len(self.x_values) < self.num_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 # 拒絕原地踏步 if x_step == 0 and y_step == 0: continue # 計(jì)算下一個(gè)點(diǎn)的 x 值和 y 值 x = self.x_values[-1] + x_step y = self.y_values[-1] + y_step self.x_values.append(x) self.y_values.append(y) # 創(chuàng)建一個(gè) RandomWalk 實(shí)例 random_wander = RandomWalk() random_wander.fill_walk() # 將所有的點(diǎn)都繪制出來(lái) plt.style.use('classic') (fig,ax) = plt.subplots() ax.scatter(random_wander.x_values, random_wander.y_values, s = 15) plt.show()
4. 總結(jié)
這篇文章主要講解了隨機(jī)漫步相關(guān)知識(shí)點(diǎn)。
到此這篇關(guān)于Python實(shí)現(xiàn)隨機(jī)漫步的文章就介紹到這了,更多相關(guān)Python隨機(jī)漫步內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python使用Gradio實(shí)現(xiàn)免費(fèi)的內(nèi)網(wǎng)穿透
內(nèi)網(wǎng)穿透是一種將內(nèi)部網(wǎng)絡(luò)服務(wù)暴露到公共網(wǎng)絡(luò)的技術(shù),可以讓外部用戶訪問(wèn)內(nèi)部網(wǎng)絡(luò)上的服務(wù),本文將介紹如何使用Gradio實(shí)現(xiàn)免費(fèi)的內(nèi)網(wǎng)穿透,需要的可以參考下2024-03-03Python讀取和處理文件后綴為.sqlite的數(shù)據(jù)文件(實(shí)例講解)
下面小編就為大家?guī)?lái)一篇Python讀取和處理文件后綴為.sqlite的數(shù)據(jù)文件(實(shí)例講解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06Python測(cè)試網(wǎng)絡(luò)連通性示例【基于ping】
這篇文章主要介紹了Python測(cè)試網(wǎng)絡(luò)連通性,結(jié)合實(shí)例形式分析了Python通過(guò)發(fā)送ping請(qǐng)求測(cè)試網(wǎng)絡(luò)連通性相關(guān)操作技巧,需要的朋友可以參考下2018-08-08PyTorch模型創(chuàng)建與nn.Module構(gòu)建
這篇文章主要為大家介紹了PyTorch模型創(chuàng)建與nn.Module構(gòu)建示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07詳解pandas中MultiIndex和對(duì)象實(shí)際索引不一致問(wèn)題
這篇文章主要介紹了詳解pandas中MultiIndex和對(duì)象實(shí)際索引不一致問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07python?實(shí)時(shí)獲取kafka消費(fèi)隊(duì)列信息示例詳解
這篇文章主要介紹了python實(shí)時(shí)獲取kafka消費(fèi)隊(duì)列信息,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07python的?PyPDF2實(shí)現(xiàn)pdf文件切割和合并
大家好,本篇文章主要講的是python的?PyPDF2實(shí)現(xiàn)pdf文件切割和合并,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2022-02-02python模擬點(diǎn)擊網(wǎng)頁(yè)按鈕實(shí)現(xiàn)方法
在本篇文章里小編給大家整理的是一篇關(guān)于python模擬點(diǎn)擊網(wǎng)頁(yè)按鈕實(shí)現(xiàn)方法,需要的朋友們可以參考下。2020-02-02