首頁  >  文章  >  後端開發  >  python隨機漫步解說

python隨機漫步解說

coldplay.xixi
coldplay.xixi轉載
2021-01-15 10:06:193553瀏覽

python隨機漫步解說

免費學習推薦:python影片教學

##隨機漫步

這次我們將使用python產生隨機漫步數據,然後用matplotlib的方式將這些數據呈現出來。

隨機漫步每次行走都完全是隨機的,沒有明確的方向,結果是由一系列隨機決策決定的。你可以這樣認為,隨機漫步就是螞蟻在暈頭轉向的情況下,每次都沿著隨機的方向所經過的路徑。

創建RandomWalk()類別

為了模擬隨機漫步,我們創建一個RandownWalk的類,它隨機選擇前進的方向。這個類別需要三個屬性,其中一個是儲存隨機漫步次數的變量,其他兩個是列表,分別儲存隨機漫步經過的每個點的x座標和y座標。

RandomWalk類別只包含兩個方法,
init()和fill_walk(),其中後者計算隨機漫步經過的所有點,下面是__init__()

from random import choiceclass RandomWalk():
    """一个生成随机漫步数据的类"""
    def __init__(self, number_points=5000):
        """初始化随机漫步的属性"""
        self.number_points = number_points        # 所有随机漫步都始于(0,0)
        self.x_values = [0]
        self.y_values = [0]
為做出隨機決策,我們將所有可能的選擇都儲存到一個清單中,並在每次做出決策時都使用choice()來決定使用哪種選擇,然後我們將隨機漫步的預設點數設定為5000,然後我們建立了兩個用於儲存x值和y值的列表,並讓每次漫步都是從(0,0)開始出發。

選擇方向

    def fill_walk(self):
        """计算随机漫步中包含的所有点"""

        # 不断漫步,直到列表达到指定的长度
        while len(self.x_values) 我們建立了一個循環,這個循環不斷進行,直到漫步包含所有需數量的點。這個方法的主要部分告訴python如何模擬四種漫步決定:向左走還是向右走?向上走還是向下走?沿著指定的方向走多遠? 

我們使用choice([1, -1])為x_direction選擇一個值,結果要麼是表示向右走的1,要麼是表示向左走的-1,接下來choice([0, 1, 2 , 3, 4])隨機選取一個0~4之間的數,告訴python沿著指定方向走多遠。
我們將移動方向乘以移動距離,以確定沿著x軸和y軸移動的距離。如果x_step為正,就會向右移動,為負向左移動,而為0將垂直移動,y_step為正向上移動,為負向下移動,為0則水平移動,如果兩個都為0那麼就以為在原地踏步,我們拒絕這種情況,接著執行下一次循環。
為取得隨機漫步的下一個點的x值,我們將x_step和x_values的最後一個值相加,對於y值也做同樣的處理。獲得下一個點的x值和y值之後,我們將它分別附加到列表x_values和y_values的末尾。

繪製隨機漫步圖

我們將上面建立RandomWalk類別的py檔案命名為random_walk.py。

下面的程式碼將隨機漫步的所有點都繪製出來:

import matplotlib.pyplot as pltfrom random_walk import RandomWalk# 创建一个RandWalk实例,并将其包含的点都绘制出来rw = RandomWalk(5000)rw.fill_walk()plt.scatter(rw.x_values, rw.y_values, s=15)plt.show()
我們首先導入了模組pyplot和RandomWalk類,然後創建了一個RandomWalk實例,並將其存儲到rw中,再調用fill_walk(),下圖就是顯示了包含了5000個點的隨機漫步圖。

python隨機漫步解說

模擬多次隨機漫步

每次隨機漫步都不相同,因此探索可能產生的各種模式很有趣。在不多次執行程式的情況下使用前面的程式碼模擬多次隨機漫步,一種方法就是將前面的程式碼放進一個while循環中,如下所示:

import matplotlib.pyplot as pltfrom random_walk import RandomWalkwhile True:
    # 创建一个RandWalk实例,并将其包含的点都绘制出来
    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
這些程式碼模擬一次隨機漫步,如果你輸入y則再繼續模擬生成一次隨機漫步,輸入n的話就退出程式了。

給點著色

我們將使用顏色映射出漫步中個點的先後順序,並刪除各個點的黑色輪廓,讓他們顏色更加明顯。為根據漫步中各點的先後順序進行著色,我們傳遞參數c,並設定一個列表,其中包含各點的先後順序。由於這些點都是按順序繪製的,因此參數c指定的清單只需包含數字1~5000即可。如下所示:

import matplotlib.pyplot as pltfrom random_walk import RandomWalkwhile True:
    # 创建一个RandWalk实例,并将其包含的点都绘制出来
    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產生了一個數字列表,其中包含的數字與漫步包含的點數相同​​。接下來,我們將這個清單儲存到point_numbers中,以方便使用它來設定每個漫步點的顏色。我們將每個參數c設為point_numbers,指定顏色映射為藍色,並傳遞實參edgecolors以刪除每個點周圍的輪廓。最終的隨機漫步圖由淺藍色漸變為深藍色。如下圖所示:


python隨機漫步解說

重新繪製起點和終點

#除了給隨機漫步各個點著色,以指出他們的先後順序外,如果還能呈現隨機漫步的終點和起點就更好了。為此,可在繪製隨機漫步圖後重新繪製隨機漫步的起點和終點。我們讓起點和終點變得更大,並顯示為不同的顏色,以突出它們,如下所示:

import matplotlib.pyplot as pltfrom random_walk import RandomWalkwhile True:
    # 创建一个RandWalk实例,并将其包含的点都绘制出来
    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.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

python隨機漫步解說

为突出起点,我们使用绿色绘制点(0,0),并使其比其它点大。为突出终点,我们在漫步包含的最后一个x值和y值处绘制一个点,使其为红色,并比其它点大。运行代码,将准确知道每次随机漫步的起点和终点。

隐藏坐标轴

下面来隐藏坐标轴,以免我们注意点是坐标轴而不是随机漫步路径。要隐藏坐标做代码如下:

# 隐藏坐标轴plt.axes().get_xaxis().set_visible(False)plt.axes().get_yaxis().set_visible(False)

为修改坐标轴,使用函数plt.axes()来将每条坐标轴的可见性设置为False。图如下:
python隨機漫步解說

相关免费学习推荐:python教程(视频)

以上是python隨機漫步解說的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除