random模組可以幫助我們產生一個範圍內的隨機數字,
可說是程式設計遊戲的精華
給大家個動機,
遊戲內有許多隨機性元素,
舉凡擲骰子、擲硬幣,玩撲克牌洗牌都可以用到隨機數,
亦可以使用這個模組模擬多次丟骰子的過程
條列幾個常用的函數:
函數
說明
random.randrange(start, stop[, step])
隨機回傳一個 range(start, stop, step) 之中的數值
random.randint(a, b)
隨機回傳一個整數 N (a <= N <= b)
random.random()
隨機回傳一個浮點數 f (0 <= f <= 1)
random.uniform(a, b)
隨機回傳一個浮點數 f (a <= f <= b)
random.shuffle(seq)
隨機洗亂seq裡的順序
random.choice(seq)
隨機回傳seq裡的元素1個
random.choices(seq, k=1)
隨機回傳seq裡的元素k個(默認一個),可能重複
random.sample(seq, k)
隨機回傳seq裡的元素k個,不會重複
實際看例子學習如何使用吧
範例: 模擬丟一個骰子
random.randint(a, b)的效果是隨機回傳介於(a <= N <= b) 的整數 N,
因此要模擬一個可以丟出1~6點的六面骰可以這樣寫:
(註: dice是骰子的英文)
import random
def dice():
return random.randint(1,6)
你可以去試著呼叫這個函數,印出數字看看:
for i in range(10):
print(dice())
應該印出來的結果每次都不一樣
應用: 計算投兩個骰子總和等於7的機率
有了這個基礎概念後,
我們便可以用來計算一些數學課上可能非常困難計算的機率
(比如說用在隨機性有關的遊戲時計算勝率之類的xdd)
那怎麼算呢?
由於實際運用時,我們可能只在乎大概的機率,
並不一定很在乎準確值是多少,
因此可以直接跑程式模擬,
比如說我們做一萬次「實驗」,
假設成功了三千次,
那麼成功的機率就大概是3000/10000次
從簡單的問題開始,請問同時投擲兩個公平的六面骰,
兩個骰子總和等於7的機率大約是多少?(取到小數點後第二位即可)
如果你高中數學還行的話,
可以很容易算出來機率是6/36 = 0.166…
用程式模擬看看數字準不準確吧
範例程式
import random
def dice():
return random.randint(1,6)
def ex():
X=dice()
Y=dice()
return X+Y==7
def simulate(experiment, times):
success=0
for i in range(times):
if experiment():
success+=1
return success/times
#估計兩個骰子總和為7的機率
print(simulate(ex,100)) #模擬丟兩個骰子100次
print(simulate(ex,1000)) #模擬丟兩個骰子1000次
print(simulate(ex,10000)) #模擬丟兩個骰子10000次
print(simulate(ex,100000)) #模擬丟兩個骰子100000次
對了,記得python的特性是可以把函數當做參數傳進另一個函數裡的,
這邊我們定義兩個函數,simulate()和ex()
ex()指的是一次「實驗」(比如說丟兩個骰子),
若等於7回傳True(表示成功),
其它狀況回傳失敗
simulate()指的是模擬多次「實驗」,
參數experiment是一個函數,
參數times表示進行實驗的次數,
跑for迴圈,每當實驗成功就將變數success加一,
最後回傳成功率
看一下小馬程式執行的結果(注意因為有隨機性,結果不是固定的數字):
丟骰子100次時,總和為7的比率: 0.15
丟骰子1000次時,總和為7的比率: 0.162
丟骰子10000次時,總和為7的比率: 0.1716
丟骰子100000次時,總和為7的比率: 0.16589
真實機率是0.166…,夠準吧?
原則上,模擬次數愈高,愈容易接近真實機率
示範就玩到這邊吧,
相信聰明如你應該可以探索出random模組更多的用途
課後練習: 骰子大比拼,輸的請午餐
瑪麗邀請你跟她玩一個骰子遊戲,
擲出點數大的人獲勝,
輸的人要請贏的人吃午餐
有兩組骰子可供選擇:
第一組 : 同時丟兩個公平的六面骰
第二組 : 丟一個公平的十二面骰(即出現1~12的機率是相同的)
瑪麗讓你先選,她挑剩下的那一組,
但是瑪麗說,因為丟兩個六面骰出現的點數是2~12,
天生比十二面骰只有1~12的點數占優勢,
因此規定若點數平手的話,那麼用十二面骰的人獲勝
你心想,瑪麗特別規定點數平手十二面骰會贏,
表示六面骰必定有詐,因此決定選十二面骰
關於勝負判定,舉幾個例子說明:
你用十二面骰擲出6,瑪麗用兩個六面骰擲出2和3,你贏了
你用十二面骰擲出6,瑪麗用兩個六面骰擲出3和4,瑪麗贏了
你用十二面骰擲出6,瑪麗用兩個六面骰擲出2和4,平手視為瑪麗贏
那麼,請問瑪麗需要請你吃午餐的機率最接近哪個數?
(a) 40%
(b) 45%
(c) 50%
(d) 55%
(e) 60%
你可以用任何方法算,
不過其實拿範例程式小改一下應該就出來了
參考答案
參考程式碼:
import random
def dice(n):
return random.randint(1,n)
def ex():
X = dice(6) + dice(6)
Y = dice(12)
return X>Y
def simulate(experiment, times):
success=0
for i in range(times):
if experiment():
success+=1
return success/times
print(simulate(ex,10000))
其實本題機率在數學上的值正好就是50%,
不論你選哪組骰子,你和瑪麗都是各自一半機率獲勝,
這個遊戲是公平的