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




13會員
91內容數
寫點東西自娛娛人
留言0
查看全部
發表第一個留言支持創作者!
你可能也想看
The Evolution of Mobile App Development Frameworks in 2024As we navigate through 2024, the mobile app development landscape continues to evolve, driven by changing consumer behaviors...
Thumbnail
avatar
Digiworld
2024-04-26
The benefits on exercise_2024.04.25複習今日所學英文~有關於運動~ 內容:成長過程中對運動的興趣、運動的正面影響。從小時候習慣了每天運動、運動選擇的改變、現在面臨的挑戰~
Thumbnail
avatar
天上的一片雲
2024-04-25
《Compassion》The sorrow of trees - a message from nature"You live for yourselves, not for humans." About trees and their feelings of sadness due to human interference.
Thumbnail
avatar
靈魂共感療域 EmpathyCave
2023-11-12
自然死亡,很難嗎? Allowing the mother nature taking over our deathNow 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
avatar
雙魚鏡方格子檔案館
2023-07-13
《The First Slam Dunk》:即使心臟噗通噗通跳,也要表現得若無其事  簡直像站在球場中看著真實的比賽讓人目不轉睛,呼吸為之屏息——傳說中灌籃高手動畫版的遺珠之憾:湘北對山王之戰終於出世。當年所有人期盼卻沒盼得的最重要的一場比賽,在生父手下脫胎而出,讓這部作品畫下奇蹟的句點。  
Thumbnail
avatar
薄荷糖
2023-01-28
The Writer And Her Story 遇見香港漫畫家智海《The Writer And Her Story》是香港漫畫家智海在1999年的作品,黑白色調的漫畫,描寫一個抑鬱的作者,被自己腦袋裡沉重的想法壓駝了背,寫下作品想為腦袋「減重」,卻被各種瑣碎問題所困,就連繪者也彷彿以上帝之手,延伸再延伸,給他沒有盡頭的樓梯和前路...
Thumbnail
avatar
林倚
2023-01-03
The Innocents Abroad👉跟馬克•吐溫遊歐亞在海上看美景,也不忘笑話別人的英語口音👉「It's gorgis, ain't it?」一起來領略一世紀前馬克•吐溫的不倒幽默!
Thumbnail
avatar
Mary Ventura
2022-09-11
the benefit of the doubt? 「懷疑的好處」是什麼語感來著?英文有一些慣用的句子,字面上怎麼讀都參不透,因為不知道背後隱含的思考邏輯。「給他懷疑的好處(give him the benefit of the doubt)」這種話在中文的邏輯中根本不成文也說不通,到底是在講什麼鬼?你只能用外國人的邏輯來想!
Thumbnail
avatar
你的英日語自學導師 譯難忘  ོꦿ༄꧁꧂
2021-06-23
《The Queen's Gambit》 你是一個奇蹟,但要學習如何生活《Queen’s Gambit》第一眼看會以為又是另一個關於天才兒童戰無不勝或者自甘墮落的故事。其實這一套劇集,講的是一個高敏感又內向的女生,如何在女權崛起之前的冷戰年代,以人生輸家之姿,晉身頂級棋手的故事,同時講述一個女孩子的前半生。
Thumbnail
avatar
Kayla 陳韻如
2021-03-19
avatar
神勇火球
2007-08-16