The Nature of Code閱讀心得與Python實作:0.5 A Custom Distribution...

閱讀時間約 9 分鐘
這一節的標題是
A Custom Distribution of Random Numbers
因為方格子標題字數限制,所以沒完整顯現

先前的隨機漫步寫法,會有oversampling的問題,也就是同一個地方可能會走過很多次。老是在相同的地方走來走去,那可不是個好習慣,因為這樣會浪費不少時間和精力。那怎樣才可以避免這樣的問題呢?時不時的跨大步是個解決的辦法。原本的走法,步伐大小是固定的,利用時不時跨大步的方式,就可以減少oversampling的數量。這種時不時跨大步的走法,稱為Lévy flight。

根據維基百科上的說明,Lévy flight是Benoît Mandelbrot所創造的名詞,用來定義呈現特定分布方式的步伐大小。Mandelbrot這位大師似乎很喜歡創造名詞,fractal這個字,就是他的傑作。

要讓原本只用固定大小步伐隨機漫步的walker,能夠具有Lévy flight的能力,時不時的跨大步走,需要用到的機率分布方式,既不是常態分布,也不是uniform distribution。例如,「越大的步伐,被使用的機率越小;越小的步伐,被使用的機率越高」,是個可以用來粗略實作出Lévy flight效果的設定方式。很顯然的,這樣子的設定方式所需要用到的機率分布,不是常態分布,也不是uniform distribution。所以,現在的問題就變成是:我們要如何產生符合特定機率分布的亂數?

在0.3節中有提到幾個方法,能夠用來產生符合特定分布的亂數。利用那些方法,就能讓walker具有Lévy flight的能力。例如

r = random.random()
if r < 0.01:
x_step = random.uniform(-100, 100)
y_step = random.uniform(-100, 100)
else:
x_step = random.uniform(-1, 1)
y_step = random.uniform(-1, 1)

原書針對這個寫法指出,這樣子寫,採取大步伐的機率會是1%。但這是不很精確的說法,因為從random.uniform(-100, 100)取得的亂數,也有可能會落在-1~1之間,而這是屬於小步伐的範圍,這會導致採取大步伐的機率,實際上會比1%還小一些。所以,比較精確的說法,應該是walker有1%的機率從比較大範圍的距離,也就是-100~100中,挑選出要用的步伐大小。不過不管怎麼說,這個機率是固定的,不管是100或99,被選中的機率都是一樣的。

雖然上述的寫法能夠讓walker具有Lévy flight的能力,但如果我們想要的,是像「越大的步伐,被使用的機率越小;越小的步伐,被使用的機率越高」這樣更複雜的能力時,又該怎麼辦呢?這時候,我們會需要用到具有特定分布方式的亂數,而這種亂數,是沒辦法使用Python提供的亂數產生器,如random.random()random.uniform()random.gauss()等,直接產生的。在遇到這種需要自己製作符合特定分布方式的亂數時,可以考慮使用accept-reject algorithm。

accept-reject algorithm也叫做rejection sampling或acceptance-rejection method,是蒙地卡羅方法(Monte Carlo method)的一種,可以用來產生符合特定機率分布的亂數。假設只考慮0~1間的亂數,其做法如下:

步驟1:取uniform distribution亂數r1。

步驟2:依照所需的機率分布,計算r1的機率p。

步驟3:取另一個uniform distribution亂數r2。

步驟4:若r2 < p,則r1符合資格,是我們所要的亂數。結束程式。

步驟5:若r2 ≥ p,則r1不符合資格,丟棄。回步驟1。

根據這個演算法,如果我們設定p = 1 - r1,那當r1 = 0.1時,就代表r1有90%的機率會符合資格而被取用;如果r1 = 0.83,則r1符合資格被取用的機率就是17%。很明顯的,這樣子的設定,會讓越大的數字,被取用的機率越低。反之,如果設定p = r1,則會讓越大的數字,被取用的機率越高。

雖然accept-reject algorithm可以產生符合我們所要的分布方式的亂數,但它的效率並不高,因為有可能會丟棄一大堆的r1之後,還是沒能找到符合資格可以取用的亂數。在取r1時,改用其他分布方式的亂數,可以改善執行效率,但有些額外的條件需要考慮。詳細的原理與說明,可以參考這篇文章:〈What is Rejection Sampling?

下面這個例子,就是應用accept-reject algorithm,在設定p = r1的情況下,符合資格的數字的分布狀況。

Example 0.5: An Accept-Reject Distribution

raw-image

從圖可以看出,數字越大,符合資格的機率就越大。程式如下:

def accept_reject():
while True:
r1 = random.random()
probability = r1
r2 = random.random()
if (r2 < probability):
return r1


# python version 3.10.9
import random
import sys

import pygame # version 2.3.0


pygame.init()

pygame.display.set_caption("Example 0.5: An Accept-Reject Distribution")

BLACK = (0, 0, 0)
WHITE = (255, 255, 255)

screen_size = WIDTH, HEIGHT = 640, 360
screen = pygame.display.set_mode(screen_size)

FPS = 60
frame_rate = pygame.time.Clock()

counter = [0]*20

rect_width = WIDTH/len(counter)

while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()

screen.fill(WHITE)

index = int(len(counter)*accept_reject())
counter[index] += 1

for i in range(len(counter)):
rect = pygame.Rect(i*rect_width, HEIGHT-counter[i], rect_width, counter[i])
pygame.draw.rect(screen, BLACK, rect, 2)

pygame.display.update()
frame_rate.tick(FPS)

Exercise 0.6

accept_reject()裡頭的probability設定成r1*r1

def accept_reject():
while True:
r1 = random.random()
probability = r1*r1
r2 = random.random()
if (r2 < probability):
return r1

另外,把Walker類別的step()修改成

def step(self):
step_size = 10*accept_reject()

step_x = random.uniform(-step_size, step_size)
step_y = random.uniform(-step_size, step_size)

self.x += int(step_x)
self.y += int(step_y)

因為accept_reject()產生的是介於0~1間的數字,所以必須乘上10來轉換成實際上的步伐大小。另外要注意的是,step_xstep_y都是浮點數,若使用set_at()來顯示walker的軌跡,因為只接受整數座標,所以必須用int()將其轉為整數。




15會員
115Content count
寫點東西自娛娛人
留言0
查看全部
發表第一個留言支持創作者!
ysf的沙龍 的其他內容
這一節的標題是0.4 A Normal Distribution of Random Numbers,介紹常態分布的基本概念,以及相關亂數產生器的使用方法與應用方式。
在模擬自然界中的事物時導入隨機性,可以讓結果看起來比較自然,但如果導入的隨機性都是uniform distribution,那未免也太呆板了。這時候,我們需要nonuniform distribution亂數,來讓模擬出來的結果,更像真的一樣。
這一節談的是用物件導向程式設計(object-oriented programming, OOP)的方式來實作隨機漫步。
隨機漫步看似簡單,但卻是模擬許多自然界現象的基礎,相關的觀念及程式實作方式,對於瞭解亂數、機率、Perlin noise等工具,會有相當大的幫助。
在這一章中,會透過介紹在螢幕上模擬物體移動時,其背後的原理與實作方法,來介紹亂數(random number)、隨機分布(random distribution)、Perlin noise等,這些可以用來引入隨機性的工具。
這一節的標題是0.4 A Normal Distribution of Random Numbers,介紹常態分布的基本概念,以及相關亂數產生器的使用方法與應用方式。
在模擬自然界中的事物時導入隨機性,可以讓結果看起來比較自然,但如果導入的隨機性都是uniform distribution,那未免也太呆板了。這時候,我們需要nonuniform distribution亂數,來讓模擬出來的結果,更像真的一樣。
這一節談的是用物件導向程式設計(object-oriented programming, OOP)的方式來實作隨機漫步。
隨機漫步看似簡單,但卻是模擬許多自然界現象的基礎,相關的觀念及程式實作方式,對於瞭解亂數、機率、Perlin noise等工具,會有相當大的幫助。
在這一章中,會透過介紹在螢幕上模擬物體移動時,其背後的原理與實作方法,來介紹亂數(random number)、隨機分布(random distribution)、Perlin noise等,這些可以用來引入隨機性的工具。
你可能也想看
Thumbnail
1.加權指數與櫃買指數 週五的加權指數在非農就業數據開出來後,雖稍微低於預期,但指數仍向上噴出,在美股開盤後於21500形成一個爆量假突破後急轉直下,就一路收至最低。 台股方面走勢需觀察週一在斷頭潮出現後,週二或週三開始有無買單進場支撐,在沒有明確的反轉訊號形成前,小夥伴盡量不要貿然抄底,或是追空
Thumbnail
重點摘要: 1.9 月降息 2 碼、進一步暗示年內還有 50 bp 降息 2.SEP 上修失業率預期,但快速的降息速率將有助失業率觸頂 3.未來幾個月經濟數據將繼續轉弱,經濟復甦的時點或是 1Q25 季底附近
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
As we navigate through 2024, the mobile app development landscape continues to evolve, driven by changing consumer behaviors...
Thumbnail
複習今日所學英文~有關於運動~ 內容:成長過程中對運動的興趣、運動的正面影響。從小時候習慣了每天運動、運動選擇的改變、現在面臨的挑戰~
Thumbnail
"You live for yourselves, not for humans." About trees and their feelings of sadness due to human interference.
Now I understand: there is no need for futile treatment or ineffective care, allowing our mother nature to take over may be the kindest approach for t
Thumbnail
  簡直像站在球場中看著真實的比賽讓人目不轉睛,呼吸為之屏息——傳說中灌籃高手動畫版的遺珠之憾:湘北對山王之戰終於出世。當年所有人期盼卻沒盼得的最重要的一場比賽,在生父手下脫胎而出,讓這部作品畫下奇蹟的句點。  
Thumbnail
《The Writer And Her Story》是香港漫畫家智海在1999年的作品,黑白色調的漫畫,描寫一個抑鬱的作者,被自己腦袋裡沉重的想法壓駝了背,寫下作品想為腦袋「減重」,卻被各種瑣碎問題所困,就連繪者也彷彿以上帝之手,延伸再延伸,給他沒有盡頭的樓梯和前路...
Thumbnail
在海上看美景,也不忘笑話別人的英語口音👉「It's gorgis, ain't it?」一起來領略一世紀前馬克•吐溫的不倒幽默!
Thumbnail
英文有一些慣用的句子,字面上怎麼讀都參不透,因為不知道背後隱含的思考邏輯。「給他懷疑的好處(give him the benefit of the doubt)」這種話在中文的邏輯中根本不成文也說不通,到底是在講什麼鬼?你只能用外國人的邏輯來想!
Thumbnail
《Queen’s Gambit》第一眼看會以為又是另一個關於天才兒童戰無不勝或者自甘墮落的故事。其實這一套劇集,講的是一個高敏感又內向的女生,如何在女權崛起之前的冷戰年代,以人生輸家之姿,晉身頂級棋手的故事,同時講述一個女孩子的前半生。
Thumbnail
1.加權指數與櫃買指數 週五的加權指數在非農就業數據開出來後,雖稍微低於預期,但指數仍向上噴出,在美股開盤後於21500形成一個爆量假突破後急轉直下,就一路收至最低。 台股方面走勢需觀察週一在斷頭潮出現後,週二或週三開始有無買單進場支撐,在沒有明確的反轉訊號形成前,小夥伴盡量不要貿然抄底,或是追空
Thumbnail
重點摘要: 1.9 月降息 2 碼、進一步暗示年內還有 50 bp 降息 2.SEP 上修失業率預期,但快速的降息速率將有助失業率觸頂 3.未來幾個月經濟數據將繼續轉弱,經濟復甦的時點或是 1Q25 季底附近
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
As we navigate through 2024, the mobile app development landscape continues to evolve, driven by changing consumer behaviors...
Thumbnail
複習今日所學英文~有關於運動~ 內容:成長過程中對運動的興趣、運動的正面影響。從小時候習慣了每天運動、運動選擇的改變、現在面臨的挑戰~
Thumbnail
"You live for yourselves, not for humans." About trees and their feelings of sadness due to human interference.
Now I understand: there is no need for futile treatment or ineffective care, allowing our mother nature to take over may be the kindest approach for t
Thumbnail
  簡直像站在球場中看著真實的比賽讓人目不轉睛,呼吸為之屏息——傳說中灌籃高手動畫版的遺珠之憾:湘北對山王之戰終於出世。當年所有人期盼卻沒盼得的最重要的一場比賽,在生父手下脫胎而出,讓這部作品畫下奇蹟的句點。  
Thumbnail
《The Writer And Her Story》是香港漫畫家智海在1999年的作品,黑白色調的漫畫,描寫一個抑鬱的作者,被自己腦袋裡沉重的想法壓駝了背,寫下作品想為腦袋「減重」,卻被各種瑣碎問題所困,就連繪者也彷彿以上帝之手,延伸再延伸,給他沒有盡頭的樓梯和前路...
Thumbnail
在海上看美景,也不忘笑話別人的英語口音👉「It's gorgis, ain't it?」一起來領略一世紀前馬克•吐溫的不倒幽默!
Thumbnail
英文有一些慣用的句子,字面上怎麼讀都參不透,因為不知道背後隱含的思考邏輯。「給他懷疑的好處(give him the benefit of the doubt)」這種話在中文的邏輯中根本不成文也說不通,到底是在講什麼鬼?你只能用外國人的邏輯來想!
Thumbnail
《Queen’s Gambit》第一眼看會以為又是另一個關於天才兒童戰無不勝或者自甘墮落的故事。其實這一套劇集,講的是一個高敏感又內向的女生,如何在女權崛起之前的冷戰年代,以人生輸家之姿,晉身頂級棋手的故事,同時講述一個女孩子的前半生。