The Nature of Code閱讀心得與Python實作:0.3 Probability and Non...

閱讀時間約 6 分鐘
這一節的標題是
0.3 Probability and Nonuniform Distributions
因為方格子標題字數限制,所以沒完整顯現

在模擬自然界中的事物時導入隨機性,可以讓結果看起來比較自然,但如果導入的隨機性都是uniform distribution,那未免也太呆板了,畢竟很多自然界中的事物,雖然看起來都很隨機,但也沒那麼隨機。例如,在繁衍後代時,基因的傳遞具有一定的隨機性,但也有「適者生存」這樣子的趨勢存在。這時候,uniform distribution亂數已經不夠用了,我們還需要nonuniform distribution亂數,來讓模擬出來的結果,更像真的一樣。

那要怎麼產生nonuniform distribution亂數呢?其實利用一些小技巧,就可以利用會產生uniform distribution亂數的亂數產生器如random.random()random.randint()等,來產生符合特定分布的亂數。不過在此之前,要先來複習一下機率。

談論機率,就不免要提到丟銅板和抽撲克牌這兩個屬於單一事件機率(single-event probability)的例子。這類型的機率,指的是發生某個事件結果的機率,例如抽撲克牌抽到老K的機率、丟銅板出現正面的機率等,計算方式很簡單,就是把所有會產生那個事件結果的數量,除以所有可能發生情況的數量。以丟銅板來說,丟銅板這個事件,可能產生的結果有正面、反面兩種。所以,出現正面這個結果的機率是1/2;出現反面的機率,同樣也是1/2。

再來看看抽撲克牌的機率算法。拿一副牌,抽中老K的機率是

老K的數量 ⁄ 牌的總量 = 4 ⁄ 52 ≈ 0.077

而抽中方塊的機率則為

方塊牌的數量 ⁄ 牌的總量 = 13 ⁄ 52 = 0.25

同樣的道理,抽中某個點數的機率約為0.077;而抽中某個花色的機率是0.25。

要計算多個事件接續出現的機率時,只要把個別事件出現的機率相乘即可。例如,丟銅板時,連續出現3次正面的機率是

(1 ⁄ 2)×(1 ⁄ 2)×(1 ⁄ 2) = 0.125

Exercise 0.2

一副撲克牌有52張,ace有四張。把牌抽出後如果放回去重洗,則連續抽出2張ace的機率是

(4 ⁄ 52)×(4 ⁄ 52) ≈ 0.0059

如果牌抽出後不放回去重洗,則連續抽出2張ace的機率是

(4 ⁄ 52)×(3 ⁄ 51) ≈ 0.0045

應用前面單一事件機率的算法,寫程式時,可以利用亂數函數,來使不同的結果,其出現機率不同。例如執行下列程式,印出1、2、3的機率會分別是40%、20%、40%。

stuff = [1, 1, 2, 3, 3]
value = random.choice(stuff)
print(value)

雖然random.choice()在抽選stuff內的元素時,每個元素被抽選中的機率都一樣是20%,但因為元素1和3都有兩個,所以最後抽選出1和3的機率,都是40%。

我們也可以讓某個事件,只在取出的亂數介於某個範圍內才發生:

prob = 0.1
r = random.random()
if (r < prob):
print("Hi!")

因為0.0 <= r < 1.0,所以會印出Hi!的機率是0.1。

這種技巧,也可以用在多重結果的事件上。例如,假設某事件出現A、B、C三種結果的機率,分別為60%、10%、30%,這時可以取一個0~1間的浮點數亂數num,然後用它來決定哪個結果會出現。程式寫法如下:

num = random.random()  # 0.0 <= num < 1.0
if (num < 0.6):
# 0.0 <= num < 0.6
print("結果A")
elif (num < 0.7):
# 0.6 <= num < 0.7
print("結果B")
else:
# 0.7 <= num < 1.0
print("結果C")

利用這個技巧,可以讓Walker在移動的時候,傾向向右走。下面這個例子,就是讓Walker向上、下、左、右走的機率,分別是20%、20%、20%、40%,這樣子的Walker,就會具有傾向向右走的特性。

Example 0.3: A Walker That Tends to Move to the Right

raw-image

Walker的step()方法,程式碼修改如下

def step(self):
r = random.random()
if (r < 0.2):
# up
self.y -= 1
elif (r < 0.4):
# down
self.y += 1
elif (r < 0.6):
# left
self.x -= 1
else:
# right
self.x += 1

Exercise 0.3

要讓Walker有50%的機率,會走向滑鼠游標的方向,可將step()方法修改為

def step(self):
r = random.random()
if (r < 0.125):
# up, 12.5%
self.y -= 1
elif (r < 0.25):
# down, 12.5%
self.y += 1
elif (r < 0.375):
# left, 12.5%
self.x -= 1
elif (r < 0.5):
# right, 12.5%
self.x += 1
else:
# mouse, 50%
(mouse_x, mouse_y) = pygame.mouse.get_pos()

if (mouse_x > self.x):
self.x += 1
else:
self.x -=1

if (mouse_y > self.y):
self.y += 1
else:
self.y -= 1

程式執行結果的截圖如下圖

raw-image




15會員
129內容數
寫點東西自娛娛人
留言0
查看全部
發表第一個留言支持創作者!
ysf的沙龍 的其他內容
這一節談的是用物件導向程式設計(object-oriented programming, OOP)的方式來實作隨機漫步。
隨機漫步看似簡單,但卻是模擬許多自然界現象的基礎,相關的觀念及程式實作方式,對於瞭解亂數、機率、Perlin noise等工具,會有相當大的幫助。
在這一章中,會透過介紹在螢幕上模擬物體移動時,其背後的原理與實作方法,來介紹亂數(random number)、隨機分布(random distribution)、Perlin noise等,這些可以用來引入隨機性的工具。
這一節談的是用物件導向程式設計(object-oriented programming, OOP)的方式來實作隨機漫步。
隨機漫步看似簡單,但卻是模擬許多自然界現象的基礎,相關的觀念及程式實作方式,對於瞭解亂數、機率、Perlin noise等工具,會有相當大的幫助。
在這一章中,會透過介紹在螢幕上模擬物體移動時,其背後的原理與實作方法,來介紹亂數(random number)、隨機分布(random distribution)、Perlin noise等,這些可以用來引入隨機性的工具。
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
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
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
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》第一眼看會以為又是另一個關於天才兒童戰無不勝或者自甘墮落的故事。其實這一套劇集,講的是一個高敏感又內向的女生,如何在女權崛起之前的冷戰年代,以人生輸家之姿,晉身頂級棋手的故事,同時講述一個女孩子的前半生。